繁体   English   中英

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

[英]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方法上:

  1. 如您所说的@Autowired(required = false)
  2. 也可以与@Lazy配对
  3. 您可以在参数为Java 8的Optional的setter方法上使用@Autowired (无需required = false)来达到相同的效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM