【问题标题】:Difference between @Autowired and @Required with setter injection in SpringSpring中@Autowired和@Required与setter注入的区别
【发布时间】:2018-04-02 12:51:36
【问题描述】:

我知道关于@Autowired@Required 注释的文章很多。

但是我有一个非常基本的问题如下 -

下面两种setter注入机制有什么区别。

我还没有得到一个完整的令人满意的答案。

原因是:

1)@Autowired 没有任何额外信息,例如 - @Autowired(required=false)@Required 相同

2)我们还从@Required 中获得了什么?

3) 为什么@Required@Autowired 在setter 注入上更受欢迎?

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;
   }
}

【问题讨论】:

标签: spring dependency-injection


【解决方案1】:

@Autowired@Required 不同。

@Required-Annotation 专门用于告诉 Spring 该属性必须通过 XML-configuration-file (eager) 中给出的信息而不是通过注释来注入。当您使用@Autowire-Annotation 时,这并不重要。

@Autowire-Annotation(如您的代码示例中所示)告诉 ApplicationContext(又名 Spring-IoC-Containter)注入所需的依赖项。 (无论如何,如果它使用注解或 ApplicationContext 的 XML-File)。

@Required-Annotation 告诉 ApplicationContext 这个属性必须在 XML 文件(ApplicationContext 的 XML 文件)中被提及,但是 Annotation 本身没有t 告诉注入依赖项。因此它用于检查它是否在 XML 配置文件中,而不是用于注入依赖项。 注入已完成,因为 XML 文件中提到了该属性。

所以最后它告诉注入必须完成,因为 XML 文件中的配置。但同样:注解并没有说明必须注入依赖项,而是必须在 XML 文件中提及它 - 然后才能注入依赖项。

提到 XML 文件中的属性,我的意思是这样的配置:

<bean id="MyClass" class="com.myclasses.common.MyClass">
     <property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>

那么我为什么要在@Autowired-Annotation 上使用它呢?

当由于 XML 配置文件中给出的信息而必须注入依赖项时,您应该使用它。

你能举个例子吗?

嗯,已经有一个很好的例子on this website. 也解释了这一点。

【讨论】:

  • 你能举个例子吗?
  • 在您提到的示例网站中,@Required 本质上仅用作依赖注入机制。
  • 它用于检查它是否在XML配置文件中,但不用于注入依赖项。注入已完成,因为 XML 文件中提到了该属性
  • 我可能应该在我的回答中添加这一点
  • 同意。但这意味着在 XML 之外使用 @Required 没有意义?它对基于注解的依赖注入有什么意义?我们如何将相同的逻辑与非基于 XML 的 bean 发现相关联?
【解决方案2】:

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. 您可以在参数为 Java 8 的 Optional 的 setter 方法上使用 @Autowired(不需要 = false)来实现相同的效果。

【讨论】:

  • @Required-Annotation 是否也会自动装配所需的依赖项?
  • 不,它不能为您注入依赖项。我已经修改了答案以使这一点更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2015-07-23
  • 2020-02-14
  • 2019-08-11
  • 1970-01-01
  • 2016-11-27
相关资源
最近更新 更多