在Spring中,'autowire = Autowire.NO'是什么意思?

5
this Spring documentation我了解到,当我使用@Bean时,默认值已经相当于:@Bean(autowire = Autowire.NO)。
(默认)不自动装配。必须通过ref元素定义bean引用。不建议更改默认设置,因为明确指定协作者可以获得更大的控制和清晰度。在某种程度上,它记录了系统的结构。
我只是想弄清楚这对我意味着什么。如果我的系统是100% Java Config并且没有XML配置,那么据我所知,当我使用@Bean时,“Autowire.no”根本没有任何影响。 编辑 我的意思是,对于其他Java Config类中的@Autowired引用,将自动装配此bean。我怀疑这是因为在Java Config中没有明确定义'ref元素',因此此(默认)设置没有影响。
例如:
第一个配置:
package a.b.c;

@Configuration
public class AlphaConfig {

    @Bean(autowire = Autowire.NO)
    public AlphaBeanType alphaBean() {
        return new AlphaBeanType();
    }
}

然后在第二个配置中:
package d.e.f;

import a.b.c.AlphaBeanType;

@Configuration
public class AnotherConfig {

    @Autowire
    private AlphaBeanType alphaBeanType;

    @Bean
    . . .
}

我看到的是,在第二个配置类中始终自动装配了“alphaBeanType”,这似乎与文档中的描述有冲突,因此我提出了问题。
当然,从文档中我无法确定!有人确切知道吗?
4个回答

5

设置Autowire.NO并不意味着该bean不能通过@Autowire注入到其他bean中。默认情况下,@Autowire按类型工作,也可以使用@Qualifier按名称进行工作。

因此,如果您的bean具有正确的类型或名称,则它将被注入到其他bean中,这是正常的。

Autowire.NO的意思是:

不要通过类型或名称来注入使用@Bean声明的bean的属性。如果bean属性在@Bean方法代码中未设置,请将其保持未填充状态。

以下是演示如何运作的代码示例,让我们定义两个bean:

public class MyBeanTwo {

    public MyBeanTwo() {
        System.out.println(">>> MY Bean 2 created!");
    }
}

public class MyBean {

    private MyBeanTwo myBeanTwo;

    public MyBean() {
        System.out.println(">>>MyBean created !!");
    }

    public void setMyBeanTwo(MyBeanTwo myBeanTwo) {
        System.out.println(">>> Injecting MyBeanTwo INTO MyBeanOne !!!");
        this.myBeanTwo = myBeanTwo;
    }
}

还有一些配置:

@Configuration
public class SimpleConfigOne {

    @Bean
    public MyBean createMyBean()   {
        return new MyBean();
    }

    @Bean
    public MyBeanTwo createMyBeanTwo() {
        return new MyBeanTwo();
    }
}

使用这个配置,应用程序的启动会产生以下日志:

>>>MyBean created !!
>>> MY Bean 2 created!

意思是创建了每个bean的一个实例,但是MyBean没有被注入MyBeanTwo,尽管存在正确类型的bean。

通过像这样声明MyBean

@Bean(autowire = Autowire.BY_TYPE)
public MyBean createMyBean()   {
    return new MyBean();
}

MyBeanOne现在可以通过按类型自动装配来设置其属性。

启动日志为:

>>>MyBean created !!
>>> MY Bean 2 created!
>>> Injecting MyBeanTwo INTO MyBeanOne !!!

这表明MyBean通过按类型注入方式注入了MyBeanTwo,与此相关的是Autowire.NO为默认值的原因:通常情况下,我们不想自动装配使用@Bean创建的bean的属性。我们通常会通过代码显式地设置属性以提高可读性,作为一种文档形式,并确保该属性设置为正确的值。

3
我既给这个答案点赞和选中(我想那是25分!),但由于尤金先回答了基本相同的答案,所以我将奖励分给了他 - 感谢您提供详细解释! - JoeG

3
@Bean注解中的autowire元素(以及基于xml的配置中bean元素的autowire属性)确定了bean自身属性的自动装配状态,并且与标有@Bean注解的bean如何被注入到其他bean没有任何关系。
另一方面,@Autowired注解明确地将构造函数、字段、setter方法或配置方法标记为由Spring的依赖注入设施自动装配。
因此,在您的情况下,使用默认的Autowire.NO模式声明在alphaBean方法上的@Bean注解禁用了AlphaBeanType bean的属性(如果有的话)的自动(即隐式)注入。而@Autowired注解表明一个AlphaBeanType bean应该被注入到AnotherConfig配置对象中。

0

这就是Spring文档上说的吧?默认值为NO。因此,即使您明确指定它,也不应该有任何影响。此外,当您指定一个bean时,您提到的它被注入Autowire.No是正确的,所以也不应该有任何影响。


在问题上添加了更多的澄清。重点是,在默认行为的情况下,其他引用不应该默认情况下通过名称在Java Config中进行自动装配,当然,实际上它们确实被自动装配。 - JoeG

0

no 是传统的 Spring 默认设置。

没有自动装配。Bean 引用必须通过 XML 文件中的 <ref/> 元素(或 ref 属性)进行定义。

我们建议在大多数情况下使用此设置,因为它使文档更加明确。

请注意,此默认模式还允许激活基于注释的自动装配。

no 仅指外部驱动的自动装配,不影响 Bean 类本身表达的任何自动装配需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接