我正在阅读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
@Autowired注释使你无需在XML文件中(或以任何其他方式)自行进行布线,而只是为你找到需要注入的内容,然后为你完成。
完整说明
该@Autowired注释允许你对什么注入其他地方跳过配置,只是它给你的。假设你的软件包是com.mycompany.movies你必须将此标记放入XML(应用程序上下文文件)中:
<context:component-scan base-package="com.mycompany.movies" />
该标签将进行自动扫描。假设必须成为Bean的每个类都使用正确的注释@Component
(例如(对于简单bean)或@Controller
(对于servlet控件)或@Repository
(对于DAO类))进行注释,并且这些类位于包的某个位置com.mycompany.movies,Spring
将查找所有这些并创建每个豆一个。这是通过对类的2次扫描完成的-第一次是它仅搜索需要成为bean的类并映射它需要进行的注入,而在第二次扫描中,它将注入bean。当然,你可以在更传统的XML文件中或使用@Configuration类(或这三种的任意组合)来定义bean 。
该@Autowired
注解告诉Spring去哪里注射需要发生。如果将其放在方法上,setMovieFinder
它将理解(通过前缀set+ @Autowired
注释)需要注入bean
。在第二次扫描中,Spring
搜索类型为的bean 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"/>
在@Autowired声明中,你还需要添加,@Qualifier以指示要注入的两种颜色的bean:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
如果你不想使用两个注释(@Autowired和@Qualifier),可以使用@Resource这两个注释:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
在@Resource(你可以在这个答案的第一个评论阅读关于它的一些额外的数据),备件你使用两个注释,而是只使用一个。
我将再添加两个评论:
优良作法是使用@Inject
而不是@Autowired
因为它不是特定于Spring
的并且是标准的一部分JSR-330
。
另一个好的做法是将@Inject/ @Autowired
放在构造函数上,而不是方法上。如果将其放在构造函数上,则可以验证注入的Bean不是null,并且在尝试启动应用程序时会快速失败,并NullPointerException
在需要实际使用Bean时避免出现。
我正在阅读spring 3.0.x参考文档以了解spring Autowired注释: 3.9.2@AutoWired和@Inject 我不能理解下面的例子。我们需要在XML中做些什么来使其工作吗? 实施例1 实施例2 两个类如何实现相同的接口和使用相同的类? 示例: 将调用哪种设计方法?我如何确保红色类的设计方法会被调用而不是蓝色?
问题内容: 在Spring会连接的类中使用 @Autowired的 优缺点是什么? 只是为了澄清,我是在专门谈论 @Autowired 注释,而不是XML的自动 装配 。 我可能只是不了解它,但是对我来说,这几乎就像是一种反模式- 您的类开始意识到它们与DI框架相关联,而不仅仅是POJO。也许我是惩罚的嘴,但我喜欢为bean设置外部XML配置,并且我喜欢使用显式的接线,因此我确切知道在哪里接线。
问题内容: 我遇到了一个例子: 我很好奇如何获取集合,因为没有设置方法,而且它是私有的。 问题答案: Java允许上一个字段或方法的访问控制被关断(是的,有一个安全检查到第一通路)经由方法,其是反射框架(二者的一部分Field和从继承)。一旦发现并写入了该字段,其余的工作就变得很简单了。只是一个简单的编程问题。 分享
本文向大家介绍详解Spring @Autowired 注入小技巧,包括了详解Spring @Autowired 注入小技巧的使用技巧和注意事项,需要的朋友参考一下 今天和同事讨论到Spring自动注入时,发现有这么一段代码特别地困惑,当然大致的原理还是可以理解的,只不过以前从来没有这么用过。想到未来可能会用到,或者未来看别人写的代码时不至于花时间解决同样的困惑,所以小编还是觉得有必要研究记录一下。
我正在学习Spring,据我所知,当我们对一个具有泛型名称(而不是setter方法)的方法使用@Annotation时,该方法的参数是自动连线的。
问题内容: 是否通过@Autowired自动检测到?使用@Qualifier时是否按名称进行依赖项注入?我们如何使用这些批注进行setter和构造函数注入? 问题答案: 你可以与一起使用。实际上,如果发现模棱两可的bean类型,spring会询问你是否明确选择了bean,在这种情况下,你应该提供限定符 例如在以下情况下,有必要提供一个限定词 编辑: 在Lombok 1.18.4中,最终可以避免使用