在Spring,'autowire = Autowire.NO'做什么?

时间:2014-01-09 12:24:53

标签: spring configuration

来自this Spring documentation我知道当我使用@Bean时,默认值已经相当于:

@Bean(autowire = Autowire.NO)

  

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

我只是想了解这对我意味着什么。如果我的系统是100%Java Config 并且没有XML配置,那么从我可以看出,当我使用@Bean时,'Autowire.no'没有任何影响。

修改

“没有影响”我的意思是对这个bean的其他@Autowired引用是自动装配的(在其他Java Config类中)。我怀疑是因为Java Config没有定义明确的'ref element',所以这个(默认)设置没有效果。

示例:

第一次配置:

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 个答案:

答案 0 :(得分:4)

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

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

Autowire.NO意味着:

  

不要按类型或名称注入使用@Bean声明的 THIS 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的属性。我们通常做的是通过代码显式设置属性以提高可读性,作为一种文档形式,并确保使用正确的值设置属性。

答案 1 :(得分:3)

autowire注释的@Bean元素(以及基于xml的配置中autowire元素的bean属性)确定<的自动装配状态strong> bean自己的属性,与如何将标有@Bean注释的bean注入其他bean无关。

另一方面明确地@Autowired注释

  

将构造函数,字段,setter方法或配置方法标记为由Spring的依赖注入工具自动装配。

因此,在您的情况下,使用默认@Bean模式在alphaBean方法上声明的Autowire.NO注释会禁用自动(即隐式)注入{的属性(如果有) {1}} bean。虽然AlphaBeanType注释表明应将@Autowired bean注入AlphaBeanType配置对象。

答案 2 :(得分:0)

这就是春季文献所说的那么正确吗?默认为NO。所以,即使你明确指定它也不应该有任何影响。另外,当你指定一个bean时,你所提到的是Autowire.No是正确的。所以它不应该有任何影响。

答案 3 :(得分:0)

no是传统的Spring默认值。

无自动接线。必须通过<ref/>元素(或ref属性)在XML文件中定义Bean引用。

在大多数情况下,我们建议这样做,因为这会使文档更加明确。

请注意,此默认模式(如果已启用)还允许注释驱动的自动装配。

no仅指外部驱动的自动装配,不影响bean类自身表达的任何自动装配要求