我知道已经写了很多关于 @Autowired
和 @Required
注释的文章。
但我有一个非常基本的问题,如下 -
下面两种setter注入(inject)机制有什么区别。
对此我还没有得到完全满意的答案。
原因是:
1)@Autowired
没有任何额外信息,例如 - @Autowired(required=false)
与 @Required
2)我们还可以从 @Required
中获得什么?
3)为什么在setter注入(inject)时推荐使用@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 配置文件(eager)中给出的信息注入(inject),而不是通过注释注入(inject)。当您使用 @Autowire
-Annotation 时,这并不重要。
@Autowire
-Annotation(如代码示例中所示)告诉 ApplicationContext(又名 Spring-IoC-Container)注入(inject)所需的依赖项。 (无论如何,如果是通过使用注释或 ApplicationContext 的 XML 文件)。
@Required
-Annotation 告诉 ApplicationContext 该属性必须在 XML 文件(ApplicationContext 的 XML 文件)中提及,但是注释本身并不告诉注入(inject)依赖项。因此它用于检查它是否在 XML 配置文件中,但不用于注入(inject)依赖项。 注入(inject)已完成,因为 XML 文件中提到了该属性。
所以最后它告诉我们,由于 XML 文件中的配置,必须完成注入(inject)。但再说一次:注释并没有告诉我们必须注入(inject)依赖项,而是必须在 XML 文件中提及它 - 然后让依赖项被注入(inject)。
提到 XML 文件中的属性时,我指的是这样的配置:
<bean id="MyClass" class="com.myclasses.common.MyClass">
<property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>
那么为什么我应该使用它而不是@Autowired-Annotation?
当由于 XML 配置文件中给出的信息而必须注入(inject)依赖项时,您应该使用它。
能给我举个例子吗?
嗯,已经有一个很好的例子了on this website.其中也对此进行了解释。
关于spring - Spring中@Autowired和@Required与setter注入(inject)的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49611665/