前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springBean内部级联

springBean内部级联

作者头像
平凡的学生族
发布2019-05-25 08:50:25
6410
发布2019-05-25 08:50:25
举报
文章被收录于专栏:后端技术后端技术

阅读Bean官方文档@Bean Methods in @Configuration Classes@Bean Lite Mode小节,可了解spring对Bean内部级联的处理。

什么是内部级联?

参考以下代码,首先我们介绍两个Bean对象,SuperBean 、InnerBean。InnerBean只有一个成员变量number,SuperBean内部持有InnerBean的引用:

代码语言:javascript
复制
public class InnerBean {
    public int number;

    public InnerBean(int number) {
        this.number = number;
    }
}

public class SuperBean {
    public InnerBean innerBean;

    public SuperBean(InnerBean innerBean) {
        this.innerBean = innerBean;
    }
}

然后我们定义一个@Configuration,代码如下。方法superBean()在创建对象时,new SuperBean(innerBean())直接调用了方法innerBean()innerBean()创建对象时,会赋予参数10:

代码语言:javascript
复制
@Configuration // 测试@Configuration
public class InnerBeanReference {
    public static int NUMBER = 10;

    @Bean
    public SuperBean superBean() {
        return new SuperBean(innerBean());
    }

    @Bean
    public InnerBean innerBean() {
        return new InnerBean(NUMBER);
    }
}

当像代码中使用了@Configuration注解时,spring会自动对Bean进行内部级联,什么意思呢?就是当你在别处依赖注入InnerBean时,得到的是SuperBean的内部对象。 为了更好说明,我们看以下代码。代码中,我们使用@Autowired注入了SuperBean和InnerBean:

代码语言:javascript
复制
@SpringBootApplication
public class Application implements CommandLineRunner{

    @Autowired private SuperBean superBean;
    @Autowired private InnerBean innerBean;

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Application.class, args);
    }
    
    @Override
    public void run(String... args) throws Exception {
        testSuperBeanWithAutowired();
    }

    public void testSuperBeanWithAutowired() {
        superBean.innerBean.number = 12;
        System.out.println(innerBean.number); // output 12.
    }

}

以上代码执行后,testSuperBeanWithAutowired被调用,并输出12. 可见,注入的innerBean正是superBean的内部对象。

Bean内部级联的触发条件

Bean内部级联只在@Configuration下能生效。如果是在@Component或甚至没有注解的情况下,spring不会进行Bean内部级联。 比如,将上面的类InnerBeanReference的注解@Configuration改为@Component后,其它代码不变,则最后会输出10。

原理

当注解了@Configuration时,为了实现Bean内部级联,spring会使用CGLIB进行动态代理。官方将这个情况称作inter-bean references。 当注解为@Component或其它时,spring只会把Bean方法视为普通的工厂方法,不会使用CGLIB进行动态代理。官方将这个情况称作@Bean Lite Mode

总结

  • @Configuration内,spring会自动处理Bean级联问题。
  • @Component等其它注解内,spring只会把Bean方法当做普通工厂方法对待
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是内部级联?
  • Bean内部级联的触发条件
  • 原理
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档