我知道已经写了很多有关@Autowired
和@Required
注释的文章。
,但我有一个非常基本的问题 -
以下两个设置器注入机理之间有什么区别。
我还没有为此得到完整的Satisafactory答案。
原因是:
1(@Autowired
没有任何其他信息,例如-@Autowired(required=false)
与@Required
2(我们还从@Required
中获得了什么?
3(为什么在Setter注入的@Autowired
上推荐@Required
?
class MyClass {
private MyService myService;
@Autowired
public void setMyService(MyService val) {
this.myService = val;
}
}
class MyClass {
private MyService myService;
@Required
public void setMyService(MyService val) {
this.myService = val;
}
}
@Autowired
与 @Required
不相同。
@Required
- 通道专门用于告诉Spring,必须通过XML-Configuration-File(急切(而不是通过注释给出的信息注入此属性。当您使用@Autowire
-Annotation时,这并不重要。
@Autowire
-antotation (如您的代码示例中(,告诉ApplicationContext(又称spring-ioc-containter(,以注入所需的依赖关系。(无论如何,是否使用注释或应用程序context的XML文件(。
@Required
-antotation ,告诉ApplicationContext,必须在XML文件(ApplicationContext的XML文件(中提及此属性注入依赖项。因此,它用于检查它是否在XML-Configuration文件中,但不能注入依赖项。注入之所以完成,是因为该属性在XML文件中提到。
最终,它说由于XML文件中的配置,必须进行注入。但同样:注释不能说明必须注入依赖性,而是必须在XML文件中提及 - 然后将依赖项注入。
在XML文件中提及该属性,我的意思是这样的配置:
<bean id="MyClass" class="com.myclasses.common.MyClass">
<property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>
那么我为什么要在 @autowired-Annotation上使用它?
由于XML-Configuration File中给出的信息,您应该在必须注入依赖项时使用它。
您可以给我一个例子吗?
好吧,这个网站上已经有一个很好的例子。在哪里也解释了。
1(您可以将@Required
视为属性已急切初始化的检查。换句话说,它要求通过配置(XML或注释(注入它。如果使用注释,则将与@Autowired
一起看到它。如果bean注入不存在,则应用程序无法使用运行时异常启动。
2(仅此而已。@Required
在应有的本质上非常具体:a(仅适用于方法,b(需要bean或启动时应用程序运行时错误。同样,您需要通过注释或XML进行依赖注入。
3(您很可能想在启动时知道bean是否未被注入,因此您可以将@Required
与@Autowired
一起使用,以获得表达。在功能方面,如果您有@Autowired
。
额外的笔记:
@Autowired
在硬币的另一侧具有更多功能,而当您想实现懒惰时。因此,在设置器方法上:
- 正如您提到的
@Autowired(required = false)
- 也可以与
@Lazy
配对 - 您可以在param是Java 8的可选效果的setter方法上具有
@Autowired
(无需必需= false(。