【问题标题】:Why do I not need @Autowired on @Bean methods in a Spring configuration class?为什么我在 Spring 配置类中的 @Bean 方法上不需要 @Autowired?
【发布时间】:2015-11-11 18:07:48
【问题描述】:

为什么会这样:

@Configuration
public class MyConfig {

  @Bean
  public A getA() {
    return new A();
  }

  @Bean               // <-- Shouldn't I need @Autowired here?
  public B getB(A a) {
    return new B(a);
  }  
}

谢谢!

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    您好 Jan,您的问题被标记为 4 年前已回答,但我找到了更好的来源: https://www.logicbig.com/tutorials/spring-framework/spring-core/javaconfig-methods-inter-dependency.html

    这是另一篇具有相同想法的文章: https://dzone.com/articles/spring-configuration-and,它还指出这种用法没有得到很好的记录,我发现这是真的。 (?)

    所以基本上如果beanA 的初始化依赖于beanB,只要你在应用程序上下文中声明这两个bean(即@Configuartion 类),spring 将在没有显式@Autowired 注释的情况下连接它们。

    【讨论】:

      【解决方案2】:

      @Autowire 允许您将 bean 从上下文注入到“外部世界”,外部世界就是您的应用程序。 由于使用 @Configuration 类,您位于“上下文世界”中,因此无需显式自动装配(从上下文中查找 bean)。

      想像从给定实例访问方法时的类比。当您在实例范围内时,无需编写this 即可访问实例方法,但外部世界必须使用实例引用。

      编辑

      当您编写@Configuration 类时,您正在为将由IOC 创建的bean 指定元数据。

      另一方面,

      @Autowire 注释允许您在应用程序中注入 initialized bean,而不是元数据。因此,不需要显式注入,因为您在 Configuration 类中没有使用 Beans。

      【讨论】:

      • 谢谢!这是在 Spring 文档的某个地方写的吗? “外部”和“上下文”世界的界限在哪里? :)
      • 这是一个很好的问题,我不确定是否有关于此的明确文档。边界将是@Configuration(它使类标记为一个包含 IOC 的 bean 定义的类)。希望我没有弄错,但您不应该在任何非配置中省略自动装配。
      • 来自 Configuration 的 Javadoc:“@Configuration 使用 @Component 进行元注释,因此 @Configuration 类是组件扫描的候选对象([...]),因此也可以利用 @Autowired /@ 在字段和方法级别注入(但不是在构造函数级别)。”对我来说,这实际上似乎表明我需要在@Bean 方法上使用@Autowired...除非@Bean 方法在某种程度上具有双重特殊性并且被排除在上述处方之外。啊,春天的魔力。 :)
      • 知道了 :) 如果您在不同的配置类之间注入,则需要自动装配:docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/… 但不是内部 - 将章节前滚动到 2.2 。这是有道理的,因为当扫描一个 @Configuration 类并处理元数据时,IOC 中有初始化的 bean。
      【解决方案3】:

      带有@Configuration 注释的类是您为上下文定义bean 的地方。但是一个spring bean应该定义它自己的依赖。四个您的案例 B 类应该在类定义中定义它自己的依赖项。例如,如果您的 B 类依赖于您的 A 类,那么它应该如下所示:

      public class B
      {
          @Autowired
          A aInstance;
      
          public A getA()
          {
              return aInstance;
          }
      
          public void setA(A a)
          {
              this.aInstance =  a;
          }
      }
      

      在上述情况下,当 spring 构建其上下文时,它会查找类型为 A 的 bean,该 bean 也被定义为配置类中的 Bean,并在运行时将其自动连接到 B,以便 B 可以在需要时使用它。

      【讨论】:

      • 嗯 .. 恐怕这似乎无法回答我的问题。我在问为什么我上面粘贴的代码在没有@Autowired 的情况下工作,而不是 B 应该如何编写。我只是很好奇@Autowired 是如何工作的。文档似乎没有完整地解释它。
      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 2018-05-30
      • 2018-10-04
      • 2013-05-27
      • 1970-01-01
      • 2018-06-15
      • 2018-12-20
      • 2020-04-10
      相关资源
      最近更新 更多