【问题标题】:@Autowired vs @Required on setter@Autowired 与 @Required 在设置器上
【发布时间】:2023-03-24 03:38:01
【问题描述】:

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

class MyClass {
   @Autowired
   MyService myService;
}

和这样的代码:

class MyClass {
   MyService myService;

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

【问题讨论】:

    标签: java spring resources autowired required


    【解决方案1】:

    @Autowired 注解用于自动装配 bean。 @Autowired 不限于 setter。它也可以与构造函数和字段一起使用。如果您在字段上使用@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

    【讨论】:

    • 可能值得添加带有@Autowired 注释的字段实际上也是@Required(除非您明确将其参数required 设置为false)
    • @kryger 感谢您指出这一点。我已经编辑了我的答案。
    • @Required 是否需要在配置时实现依赖关系?
    • @user2171669 - 配置时间,如果你的意思是启动时间,那么是的,@Required 需要在启动时完成。 @Request 将在创建 Bean 时检查,即在 Spring 上下文初始化时。如果你的意思是编译时间,那么没有。这一切都发生在上下文初始化时。请注意,在配置中指定 会告诉 Spring 检查 @Required 注释。还要检查RequiredAnnotationBeanPostProcessor https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/annotation/RequiredAnnotationBeanPostProcessor.html
    • @kryger 你是舒尔吗?我不认为由于 ApplicationContext 的 XML 文件,使用 Autowire-annotation 您不能确定注入依赖项。
    【解决方案2】:

    @Autowired@Required 不同。

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

    @Required-Annotation,告诉 ApplicationContext 这个属性必须在 XML 文件(ApplicationContext 的 XML 文件)中被提及,这会导致依赖被注入通过使用 XML 文件(当然也可以预期)。但是注释本身并没有告诉注入依赖! 注入已完成,因为 XML 文件中提到了该属性。很高兴知道,您可能需要它。

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

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

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

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

    你能举个例子吗?

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

    【讨论】:

      【解决方案3】:

      @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());
        }
        }
        
        
        
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-27
        • 2018-12-25
        • 2016-11-27
        • 2011-08-12
        • 2021-01-07
        • 2018-01-15
        • 2011-05-04
        相关资源
        最近更新 更多