@Autowired和 @required在春季注入塞特的差异



我知道已经写了很多有关@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在硬币的另一侧具有更多功能,而当您想实现懒惰时。因此,在设置器方法上:

  1. 正如您提到的@Autowired(required = false)
  2. 也可以与@Lazy
  3. 配对
  4. 您可以在param是Java 8的可选效果的setter方法上具有@Autowired(无需必需= false(。

最新更新