了解 Spring @Autowired 的用法

2023-12-08

我正在阅读 spring 3.0.x 参考文档来理解 Spring Autowired 注释:

3.9.2 @Autowired 和 @Inject

我无法理解下面的例子。我们是否需要在 XML 中做一些事情才能使其正常工作?

实施例1

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

实施例2

public class MovieRecommender {

    private MovieCatalog movieCatalog;

    private CustomerPreferenceDao customerPreferenceDao;

    @Autowired
    public void prepare(MovieCatalog movieCatalog,
                    CustomerPreferenceDao customerPreferenceDao) {
        this.movieCatalog = movieCatalog;
        this.customerPreferenceDao = customerPreferenceDao;
    }

    // ...
}

如何自动装配两个类来实现相同的接口并使用相同的类?

例子:

class Red implements Color
class Blue implements Color

class myMainClass{
    @Autowired 
    private Color color;

    draw(){
        color.design(); 
    } 
}

将调用哪种设计方法?如何确保将调用 Red 类的设计方法而不是 Blue 类的设计方法?


TL;DR

The @Autowired注释使您无需在 XML 文件(或任何其他方式)中自行进行连接,只需为您找到需要注入的内容并为您执行此操作。

完整解释

The @Autowired注释允许您跳过其他地方的注入内容配置,并为您完成它。假设您的包裹是com.mycompany.movies您必须将此标记放入 XML(应用程序上下文文件)中:

<context:component-scan base-package="com.mycompany.movies" />

该标签将进行自动扫描。假设每个必须成为 bean 的类都使用正确的注释进行注释,例如@Component(对于简单的bean)或@Controller(对于 Servlet 控件)或@Repository (for DAO类)并且这些类位于包下的某个位置com.mycompany.movies,Spring 将找到所有这些并为每个创建一个 bean。这是通过对类进行两次扫描来完成的 - 第一次它只是搜索需要成为 bean 的类并映射它需要执行的注入,而在第二次扫描时它会注入 bean。当然,您可以在更传统的 XML 文件中或使用@Configuration类(或三者的任意组合)。

The @Autowired注解告诉 Spring 需要在哪里进行注入。如果你把它放在一个方法上setMovieFinder它理解(通过前缀set + the @Autowired注解)表明需要注入一个 bean。在第二次扫描中,Spring 搜索类型为MovieFinder,如果找到这样的 bean,就会将其注入到此方法中。如果它找到两个这样的豆子,你会得到一个Exception。为了避免Exception,您可以使用@Qualifier注释并告诉它以以下方式注入两个 bean 中的哪一个:

@Qualifier("redBean")
class Red implements Color {
   // Class code here
}

@Qualifier("blueBean")
class Blue implements Color {
   // Class code here
}

或者,如果您更喜欢在 XML 中声明 bean,则它看起来像这样:

<bean id="redBean" class="com.mycompany.movies.Red"/>

<bean id="blueBean" class="com.mycompany.movies.Blue"/>

In the @Autowired声明,您还需要添加@Qualifier告诉要注入两种颜色的豆中的哪一种:

@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
  this.color = color;
}

如果您不想使用两个注释(@Autowired and @Qualifier) 您可以使用@Resource将这两者结合起来:

@Resource(name="redBean")
public void setColor(Color color) {
  this.color = color;
}

The @Resource(您可以在该答案的第一条评论中阅读有关它的一些额外数据)使您无需使用两个注释,而是只使用一个注释。

我再补充两条评论:

  1. 好的做法是使用@Inject代替@Autowired因为它不是 Spring 特定的,并且是的一部分JSR-330标准.
  2. 另一个好的做法是将@Inject / @Autowired在构造函数而不是方法上。如果将其放在构造函数上,则可以验证注入的 bean 是否不为 null,并在尝试启动应用程序时快速失败并避免NullPointerException当你需要实际使用 bean 时。

Update:为了完成图片,我创建了一个新问题有关@Configuration class.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Spring @Autowired 的用法 的相关文章

  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • Spring 规范 - 谓词的联合

    我需要一个函数来过滤参数并构建查询 我有 4 个参数 因此如果我尝试为每个条件实现查询 我将不得不编写 16 2 4 实施 这不是一个好主意 我尝试通过界面改进我的代码Specification来自 Spring Data JPA 但我无法
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 使用 JUnit 时,有没有办法验证测试方法中是否调用了 try/catch 指令的 Catch 部分?

    例如 如果我想测试以下课程 public class SomeClass public void someMethod try Some code where comething could go wrong catch Exception
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • Mapstruct:使用加法器时清除更新集合

    我尝试将 DTO 对象映射到 JPA 实体 我有一个集合children in my ParentEntity 可以添加它们addChild Mapstruct 通过以下方式支持使用加法器CollectionMappingStrategy
  • JButton() 仅在鼠标悬停时起作用

    import java awt import java awt image import java awt event import javax imageio import java lang import java io import
  • json.net 将字符串反序列化为嵌套类

    我收到从 http 请求返回的 Json 字符串 如下所示 info calls 0 errors error1 error2 error3 messages 0 mail 3 received 5 valid 3 我试图反序列化的实体的结
  • 如何在 MySQL 替换命令中使用正则表达式?

    我的目标是用包罗万象的链接替换数据库中的链接 我通常使用 REPLACE 命令来替换数据库中的字符串 但这次我遇到了困难 因为为了找到链接 我需要使用正则表达式 而这根本行不通 UPDATE node revisions SET body
  • R 抑制依赖项中的startupMessages

    我的 R 包的依赖项之一在加载时显示启动消息 我想抑制这些启动消息 到目前为止 我发现的唯一修复是从我的描述文件中的 Depends 行中删除有问题的包 然后打电话suppressPackageStartupMessages require
  • Android 选项卡 - 开始一个新活动

    TabHost 中有 4 个选项卡 分别是 A B C 和 D 现在每个选项卡只是一个索引页 单击其中任何一个都会显示不同的活动 问题是 当用户从选项卡中显示的内容中选择某些内容时 我需要启动另一个活动 其他活动也应该显示在父选项卡本身中
  • 使用谷歌分析跟踪重定向页面

    我正在尝试使用谷歌分析跟踪重定向页面 我有一个名为redirect php 当我访问像这样的网址时redirect php c 12345678 一个 php 函数对 sql 查找表进行查询以解码代码12345678使用先前插入的 url
  • 有条件地生成表格行中断

    我有一个 table 有两个单元格 如果设备是计算机 我想水平显示 如果设备是移动设备 我想垂直显示 我借用了一个JS函数来从这个答案中检测移动设备https stackoverflow com a 11381730 3298930效果很好
  • 在 PyGame 中,如何在不使用 sleep 函数的情况下每 3 秒移动一个图像?

    最近我学习了一些基本的Python 所以我正在使用PyGame编写一个游戏来提高我的编程技能 在我的游戏中 我想每3秒移动一个怪物的图像 同时我可以用鼠标瞄准它并点击鼠标射击它 一开始我尝试使用时间 睡眠 3 但结果却暂停了整个程序 并且我
  • iCloud 仪表板:无法将 CloudKit 架构部署到生产环境 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个已发布的应用程序 具有现有的生产模式 我对开发模式进行了更改 现在我想部署到生产中 点击后Deploy Schema to Production 弹出对话框显示The
  • Python 中的 CSV 在 Windows 上添加额外的回车符

    import csv with open test csv w as outfile writer csv writer outfile delimiter quoting csv QUOTE MINIMAL writer writerow
  • Python Tkinter 滑块自定义

    I m new with tkinter and I want to create a slider like the one in this picture 但我不知道这是否可能 所以我的问题是 这可能吗 有人为我提供快速教程或其他东西吗
  • 使用 rlang 将权重传递给 glm()

    我想通过weights to glm 通过函数而无需使用eval substitute or do call 方法 但使用rlang 这描述了一个更复杂的底层函数 Toy data mydata dplyr tibble outcome c
  • 文件上传|无需刷新页面 |支柱2 |无闪光|

    问题描述 我想使用JSP创建一个文件上传屏幕 该屏幕将允许用户在屏幕上选择多个文件 但所有文件都只有一个 上传 按钮 单击上传按钮后 应在 Action 类中获取所有文件对象 但重要的是提交后页面不应该刷新 同一屏幕上还会显示其他信息 这些
  • 将数据从子组件传递到父组件(子组件通过路由加载)

    我有这个问题 Chat是一个父组件 它有Messages子组件 我有 url s chat chat id 所以我可以得到 id参数输入Messages组件与路由参数 但我需要那个 id in Chat成分 所以如果我加载 chat 46
  • jquery可以读取外部页面的dom元素吗?

    是否可以读取和解析 cnn com 例如 等第三方网站的 dom 元素 以便我可以获得 div a p 标签并读取位置和大小信息 jquery 可以解析并显示您的 javascript 代码运行的网页信息 但是如果我们向 load 命令提供
  • 如何反序列化 PHP 序列化数组/变量/类并在 C# 中返回合适的对象

    目标是反序列化PHP 序列化C 中的字符串并获取合适的对象 有什么方法可以在 C Net 中实现这一点吗 更具体 我们需要创建一个应用程序 通过 HTTP 与特定网站进行通信 该网站返回所需的信息 幸运 不幸的是 我们没有网站权限 因此数据
  • 启用文本过滤器时如何引用列表项的原始位置?

    当我使用编辑文本来过滤项目时 列表位置变得一团糟 并且项目不再调用正确的意图 任何帮助表示赞赏 lv setOnItemClickListener new OnItemClickListener public void onItemClic
  • 多个 Rails 应用程序 nginx 乘客配置

    I used this设置服务器指南 这是我的配置 nginx nginx conf user www data worker processes auto pid run nginx pid events worker connectio
  • 了解 Spring @Autowired 的用法

    我正在阅读 spring 3 0 x 参考文档来理解 Spring Autowired 注释 3 9 2 Autowired 和 Inject 我无法理解下面的例子 我们是否需要在 XML 中做一些事情才能使其正常工作 实施例1 publi