@Autowired vs @Required on setter

问题描述 投票:23回答:2

我很想知道这样的代码有什么区别:

class MyClass {
   @Autowired
   MyService myService;
}

和这样的代码:

class MyClass {
   MyService myService;

   @Required
   public void setMyService(MyService val) {
       this.myService = val;
   }
}
java spring resources autowired required
2个回答
35
投票

当您想要自动装配bean时使用@Autowired注释。 @Autowired不仅限于二传手。它也可以与构造函数和字段一起使用。如果在字段上使用@Autowired批注,则该字段将使用具有匹配数据类型的bean自动装配。

@Required检查是否已设置特定财产。如果某个字段已使用@Required注释进行注释且该字段未设置,则您将获得org.springframework.beans.factory.BeanInitializationException

参考:

Spring @Autowired usage

Recommended usage of Spring's @Required annotation

编辑:正如'kryger'指出:用@Autowired注释的字段实际上也是@Required(除非你明确地将其参数设置为false)。例如:

@Autowired(required=false)
private ObjectType objectType;

对于已注释@Autowired的字段,如果没有匹配数据类型的bean,则抛出org.springframework.beans.factory.BeanCreationException


8
投票

@Autowired@Required不同。

@Autowire-Annotation(如代码示例中所示)告诉ApplicationContext(a.k.a Spring-IoC-Containter)注入所需的依赖项。 (无论如何,如果它通过使用注释或ApplicationContext的XML文件)。

@Required-Annotation告诉ApplicationContext必须在XML文件(ApplicationContext的XML文件)中提及此属性,而不是通过使用XML-File注入依赖关系(或者课程)。但是Annotation本身并没有告诉注入依赖!注入完成是因为XML文件中提到了该属性。很高兴知道,你可能需要它。

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

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

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

当必须通过XML配置文件中的信息注入依赖项时,应该使用它。

能给我举个例子?

好吧,已经有一个非常好的例子on this website.,这里也有解释。

© www.soinside.com 2019 - 2024. All rights reserved.