为什么我在Spring配置类中不需要@Autowired @Bean方法?

时间:2015-08-18 17:08:13

标签: java spring dependency-injection

为什么这样做:

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

谢谢!

3 个答案:

答案 0 :(得分:12)

@Autowire允许您将bean从上下文注入到#34;外部世界&#34;外部世界是你的应用。 由于@Configuration类属于&#34; context world&#34;,因此无需显式自动装配(从上下文中查找bean)。

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

修改

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

另一方面,

@Autowire注释允许您在应用程序中注入初始化 bean,而不是元数据。因此,不需要显式注入,因为在Configuration类内部时你不使用Beans。

答案 1 :(得分: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(即{{ 1}}类。

enter image description here

答案 2 :(得分:-1)

具有@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正在构建它的上下文时,它会查找bean的类型是A,它也在你的配置类中定义为Bean,并在运行时将它自动装配到B,以便B可以在必需的。