繁体   English   中英

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

[英]Why do I not need @Autowired on @Bean methods in a Spring configuration class?

为什么这样做:

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

谢谢!

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

想想从给定实例访问方法时的类比。 当您在实例范围内时,无需编写this来访问实例方法,但外部世界将不得不使用实例引用。

编辑

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

另一方面,@ @Autowire注释允许您在应用程序中注入已初始化的bean,而不是元数据。 因此,不需要显式注入,因为在Configuration类中时您没有使用 Bean。

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

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

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

在此处输入图片说明

带有 @Configuration 注释的类是您为上下文定义 bean 的地方。 但是 Spring bean 应该定义自己的依赖项。 四你的case 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 可以在需要时使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM