![](/img/trans.png)
[英]Difference between @Autowired final setter and non-final setter in spring
[英]Difference between @Autowired and @Required with setter injection in Spring
我知道关于@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;
}
}
@Autowired
与@Required
。
@Required
-Annotation专门用于告诉Spring该属性必须由XML配置文件(急切)中给出的信息注入,而不是通过注释注入。 当您使用@Autowire
-Annotation时,这并不重要。
@Autowire
-Annotation (如您的代码示例中所示),告诉ApplicationContext(又名Spring-IoC-Containter)注入所需的依赖项。 (无论如何,是否通过使用批注或ApplicationContext的XML文件)。
@Required
-Annotation告诉ApplicationContext必须在XML文件(ApplicationContext的XML文件)中提及此属性,但是Annotation本身并不能告诉您注入依赖项。 因此,它用于检查它是否在XML配置文件中,而不用于注入依赖项。 因为在XML文件中提到了属性,所以完成了注入。
因此最后,它表明由于XML文件中的配置而必须进行注入。 但是再一次:注释并没有说明必须注入依赖项,而是必须在XML-File中提及它-然后允许注入依赖项。
提到XML文件中的属性,我的意思是例如这样的配置:
<bean id="MyClass" class="com.myclasses.common.MyClass">
<property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>
那么,为什么要在@ Autowired-Annotation上使用它呢?
当由于XML配置文件中提供的信息而必须注入依赖项时,应使用它。
你能举个例子吗?
1)您可以将@Required
视为该属性已被初始化的检查。 换句话说,它要求通过配置(xml或注释)注入它。 如果使用了注释,那么您会在@Autowired
旁边看到它。 如果注入的Bean不存在,则应用程序将因运行时异常而无法启动。
2)没事没事。 @Required
的含义非常具体:a)仅适用于方法,b)在启动时需要bean或其他应用程序运行时错误。 同样,您需要通过注释或xml进行依赖项注入。
3)最有可能在启动时想知道是否无法注入Bean,因此您可以将@Required
和@Autowired
以提高表达力。 从功能@Autowired
,如果您具有@Autowired
,则不需要它。
额外说明:
@Autowired
在硬币的另一侧具有更多功能,即当您要实现懒惰时。 所以在setter方法上:
@Autowired(required = false)
@Lazy
配对 @Autowired
(无需required = false)来达到相同的效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.