@Autowired和@Required与Spring中的setter注入之间的区别

时间:2018-04-02 12:51:36

标签: spring dependency-injection

我知道很多关于@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;
   }
}

2 个答案:

答案 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方法上:

  1. 正如您提到的@Autowired(required = false)
  2. 也可以与@Lazy
  3. 配对
  4. 你可以在一个setter方法上拥有@Autowired(不需要= false),该方法的参数是Java 8&Optional,它可以达到同样的效果。