深入了解下springboot中的bean加载和覆盖问题

springboot难免要用到bean,但这些bean如何导入,对于初学者时间头疼的事,本文尽量简单的例子说明springboot是如何处理bean的。

相关问题:@TestConfiguration 无法覆盖bean
@Configuration 配置不生效
bean的继承和后续手动注入

java注解bean配置类
原则1:@TestConfiguration 复写 @Configuration

即 @TestConfiguration 优先于@Configuration

原则2: xml配置优先于class配置,

即约定优于配置原则,配置改写约定

原则3:后置替换前置

同名文件后置文件替换前置文件,非同名文件,后置的bean替换前置的bean定义;
这里是替换,注意不是补充或者修正是完全替换定义。

@ImportResource(locations = {
            "classpath:A.xml",
            "classpath:B.xml"})  //这里test里的配置优先级是最高的

这里AB中的如果同时定义了bean1 则最终生效的是B中的bean1;如果引用(父级)包中也存在A,那么恭喜你,引用(父级)包中的A将不会再起作用,即使其中有本项目中A不同的bean定义也不会被实现,完全被本地的A所替代。

@TestConfiguration ,@Configuration,这两个是一对, Configuration用在正式的包里,TestConfiguration是用在测试的包里,是对Configuration的补充和“覆盖”。
这里需要特别注意的是如果同时存在xml和config.class包的引入,则xml会在java配置的bean后面引入,也即xml的配置会覆盖掉Configuration和TestConfiguration中的注入,也就是说TestConfiguration里的java定义的覆盖仅仅是针对java方式定义的bean的有效,xml的则需要单独引入测试用的xml才可以)。如果需要在以java方式覆盖掉xml的配置,这在springboot里是不被允许的,也即xml配置优先于java config方式的注入,以方便通过修改配置的方式升级jar包程序。但是如果想在测试的时候在不引入新的xml的情况下测试怎么覆盖呢?这就需要下面的AnnotationConfigApplicationContext和GenericApplicationContext这两个类来重新注入修改,注意这时候ioc里的是修改了的,但之前通过@Autowired创建的属性是不会自己自动更新的,需要手动更新或者自己重新获取进行测试。

注解引入bean的两种方式

@ImportResource :引入xm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值