我知道很多关于@Autowired
和@Required
注释的文章。
但我有一个非常基本的问题如下 -
以下两种二传手注射机制有什么区别。
我还没有得到一个完整的满意答案。
原因是:
1)@Autowired
没有任何额外信息,例如 - @Autowired(required=false)
与@Required
相同
2)我们还从@Required
获得了什么?
3)为什么@Required
推荐在@Autowired
上进行二次注射?
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;
}
}
答案 0 :(得分:2)
@Autowired
与@Required
不同。
@Required
- Annotation专门用于告诉Spring必须通过XML-configuration-file(eager)中给出的信息注入此属性,而不是通过注释。当您使用@Autowire
- 注释时,这并不重要。
@Autowire
- Annotation (如代码示例中所示)告诉ApplicationContext(a.k.a Spring-IoC-Containter)注入所需的依赖项。 (无论如何使用注释或ApplicationContext的XML-File)。
@Required
- Annotation 告诉ApplicationContext必须在XML文件(ApplicationContext的XML文件)中提及此属性,但是它自己的注释并没有告诉注入依赖。因此,它用于检查它是否在XML配置文件中,而不是注入依赖项。 完成注入是因为XML文件中提到了该属性。
所以最后它告诉我必须完成注入,因为XML-File中的配置。但同样:注释并不表示必须注入依赖关系,但必须在XML-File中提及 - 然后才能注入依赖关系。
在XML文件中提及属性我的意思是这样的配置:
<bean id="MyClass" class="com.myclasses.common.MyClass">
<property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>
那么我为什么要在@ Autowired-Annotation上使用它?
由于XML配置文件中给出的信息,必须在必须注入依赖项时使用它。
你能举个例子吗?
嗯,已经有一个非常好的例子on this website.,其中也有解释。
答案 1 :(得分:1)
1)您可以将@Required
视为检查该属性是否已被急切初始化。换句话说,它需要通过配置(xml或注释)注入它。如果使用了注释,那么您将在@Autowired
旁边看到它。如果注入的Bean不存在,则应用程序无法以运行时异常启动。
2)更不用说了。 @Required
在其意图中非常具体:a)仅适用于方法,b)在启动时需要bean或其他应用程序运行时错误。同样,您需要通过注释或xml进行依赖注入。
3)很可能你想在启动时知道Bean是否未能注入,因此你可以@Required
和@Autowired
表达。如果你有@Autowired
,那么你不需要它的功能性。
额外说明:
@Autowired
在硬币的另一面有更多功能 - 当你想要实现懒惰时。所以在setter方法上:
@Autowired(required = false)
@Lazy
@Autowired
(不需要= false),该方法的参数是Java 8&Optional,它可以达到同样的效果。