首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在春天,'autowire = Autowire.NO‘是做什么的?

在春天,'autowire = Autowire.NO‘是做什么的?
EN

Stack Overflow用户
提问于 2014-01-09 12:24:53
回答 4查看 4.5K关注 0票数 5

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

@Bean(autowire = Autowire.NO)

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

我只是想弄明白这对我意味着什么。如果我的系统是100%的Java ,并且没有XML配置,那么从我所知道的情况来看,当我使用@Bean时,'Autowire.no‘没有任何影响。

编辑

所谓“无影响”,我的意思是,其他对此bean的@Autowired引用都是自动处理的(在其他Java类中)。我怀疑这是因为在Java中没有明确的“ref元素”定义,因此这个(默认)设置没有任何效果。

示例:

第一次会议:

代码语言:javascript
复制
package a.b.c;

@Configuration
public class AlphaConfig {

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

然后在第二个配置中:

代码语言:javascript
复制
package d.e.f;

import a.b.c.AlphaBeanType;

@Configuration
public class AnotherConfig {

    @Autowire
    private AlphaBeanType alphaBeanType;

    @Bean
    . . .
}

我看到的是'alphaBeanType‘总是自动出现在第二个配置类中--这似乎与文档冲突--因此我提出了一个问题。

端编辑

当然,我无法从文档中完全分辨出来!有人确切地知道吗?

EN

Stack Overflow用户

回答已采纳

发布于 2014-01-13 23:11:18

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

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

Autowire.NO的意思是:

不要注入的属性--这个 bean是用@Bean声明的,也不按类型或名称声明。如果没有在@Bean方法代码中设置bean属性,则将其保留为未填充。

这是一个如何工作的代码示例,让我们定义两个bean:

代码语言:javascript
复制
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;
    }
}

以及一些配置:

代码语言:javascript
复制
@Configuration
public class SimpleConfigOne {

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

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

使用此配置,此应用程序的启动将给出以下日志:

代码语言:javascript
复制
>>>MyBean created !!
>>> MY Bean 2 created!

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

通过这样声明MyBean

代码语言:javascript
复制
@Bean(autowire = Autowire.BY_TYPE)
public MyBean createMyBean()   {
    return new MyBean();
}

MyBeanOne现在有资格通过自动按类型设置它的属性。

启动日志变成:

代码语言:javascript
复制
>>>MyBean created !!
>>> MY Bean 2 created!
>>> Injecting MyBeanTwo INTO MyBeanOne !!!

这表明MyBean通过by类型注入按类型注入MyBeanTwo

为什么Autowire.NO是默认的:

通常,我们不希望自动使用@Bean创建bean的属性。我们通常做的是通过代码显式地设置属性以提高可读性,作为文档的一种形式,并确保使用正确的值设置属性。

票数 5
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21020187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档