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