@Autowired vs @Required on setter

时间:2013-09-19 00:56:19

标签: java spring resources autowired required

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

class MyClass {
   @Autowired
   MyService myService;
}

和这样的代码:

class MyClass {
   MyService myService;

   @Required
   public void setMyService(MyService val) {
       this.myService = val;
   }
}

3 个答案:

答案 0 :(得分:32)

当您想要自动装配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

答案 1 :(得分:6)

@Autowired@Required不同。

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

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

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

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

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

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

你能举个例子吗?

嗯,已经有一个非常好的例子on this website.,其中也有解释。

答案 2 :(得分:0)

@watchme @Required -annotation通知容器该属性需要作为配置的一部分进行初始化,可以通过xml配置或通过@Autowired注释或通过Java bean创建来初始化

  1. xml示例:

    public class SimpleMovieLister 
    { 
     private MovieFinder movieFinder;
    
     @Required
     public void setMovieFinder(MovieFinder movieFinder)
     {
        this.movieFinder = movieFinder;
     }
    }
    
    <beans ...>
    <bean id = "movieFinder" class = "com.test.MovieFinder">
    
    <bean id = "simpleMovieLister" class = "com.test.SimpleMovieLister">
     <property name = "movieFinder" value = "movieFinder" />
    
  1. 通过@Autowire

    public class SimpleMovieLister 
    { 
      @Autowired 
      @Required
      private MovieFinder movieFinder;
    }
    
    

实际上,我们不需要@Required,因为@Autowired默认是必需的。

  1. 通过@Bean

    public class SimpleMovieLister 
    { 
      private MovieFinder movieFinder;
    
      @Required
      public void setMovieFinder(MovieFinder movieFinder)
      {
         this.movieFinder = movieFinder;
      }
    }
    
    
    public class AppConfig {
    
    @Bean
    public SimpleMovieLister getSimpleMovieLister()
    {
       SimpleMovieLister simpleMovieLister = new SimpleMovieLister();
       simpleMovieLister.setMovieFinder(new MoveFinder());
    }
    }