spring - Spring中@Autowired和@Required与setter注入(inject)的区别

标签 spring dependency-injection

我知道已经写了很多关于 @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/

相关文章:

c# - 如何在运行时更新 Autofac 容器中的注册实例

php - Laravel 单例无法跨 Controller /ViewComposer 工作

java - 使用通用返回类型的 Spring Webclient

java - Spring中如何使用Singleton对象?

hibernate - spring 3.1、hibernate 4、tiles2、tomcat 7 - 清理(多次部署导致内存泄漏)

Spring Boot 不适用于 Elastic Beanstalk

Java Play 2.4 使用注入(inject)为类编写测试用例

java - Put-Request 抛出 401 [no body] 错误,无法存储在响应实体中

dependency-injection - requireBinding有什么用?

c# - Autofac 注入(inject)通用接口(interface)的 IEnumerable