在 Spring 中,'autowire = Autowire.NO' 有什么作用?

Joe*_*oeG 5 configuration spring

这个 Spring 文档中我知道当我使用 @Bean 时,默认值已经等同于:

@Bean(autowire = Autowire.NO)

(默认)没有自动装配。Bean 引用必须通过 ref 元素定义。对于较大的部署,不建议更改默认设置,因为明确指定协作者可以提供更好的控制和清晰度。在某种程度上,它记录了系统的结构。

我只是想了解这对我意味着什么。如果我的系统是 100% Java 配置并且没有 XML 配置,那么据我所知,当我使用 @Bean 时,“Autowire.no”没有任何影响。

编辑

“无影响”是指其他对此 bean 的 @Autowired 引用是自动装配的(在其他 Java Config 类中)。我怀疑这是因为在 Java Config 中没有明确定义“ref 元素”,因此此(默认)设置无效。

例子:

第一个配置:

package a.b.c;

@Configuration
public class AlphaConfig {

    @Bean(autowire = Autowire.NO)
    public AlphaBeanType alphaBean() {
        return new AlphaBeanType();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在第二个配置中:

package d.e.f;

import a.b.c.AlphaBeanType;

@Configuration
public class AnotherConfig {

    @Autowire
    private AlphaBeanType alphaBeanType;

    @Bean
    . . .
}
Run Code Online (Sandbox Code Playgroud)

我看到的是“alphaBeanType”总是在第二个配置类中自动装配 - 这似乎与文档冲突 - 因此我的问题。

结束编辑

当然,我不能从文档中完全分辨出来!有人有确切消息么?

Ang*_*ity 5

设置Autowire.NO并不意味着该bean不能通过 注入到其他bean中@Autowire@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

以及一些配置:

@Configuration
public class SimpleConfigOne {

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

    @Bean
    public MyBeanTwo createMyBeanTwo() {
        return new MyBeanTwo();
    }
}
Run Code Online (Sandbox Code Playgroud)

通过此配置,该应用程序的启动会给出以下日志:

>>>MyBean created !!
>>> MY Bean 2 created!
Run Code Online (Sandbox Code Playgroud)

这意味着每个 bean 的一个实例被创建,但MyBean没有被注入MyBeanTwo,即使存在具有正确类型的 bean。

通过MyBean这样声明:

@Bean(autowire = Autowire.BY_TYPE)
public MyBean createMyBean()   {
    return new MyBean();
}
Run Code Online (Sandbox Code Playgroud)

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

启动日志变为:

>>>MyBean created !!
>>> MY Bean 2 created!
>>> Injecting MyBeanTwo INTO MyBeanOne !!!
Run Code Online (Sandbox Code Playgroud)

这表明MyBeanMyBeanTwo通过按类型注入按类型注入。

Autowire.NO 为默认值的原因:

通常我们不想自动装配使用@Bean. 我们通常做的是通过代码显式设置属性以提高可读性,作为文档的形式,并确保属性设置为正确的值。

  • 我都投了赞成票并选择了这个作为答案(认为这是 25 分!),但是给了尤金额外的奖励,因为他是第一个给出实际上相同答案的人 - 感谢详细信息! (3认同)