背景
我们在定义spring-boot-starter时,有时会使用@AutoConfigureBefore
、@AutoConfigureAfter
来指定自动装配配置之间的加载顺序。
使用此注解要注意两点:
- 被注解修饰的类要在spring.factories中的
org.springframework.boot.autoconfigure.EnableAutoConfiguration
指定,不能用@Configuration
修饰,否则会立刻被spring扫描到,不能实现指定顺序,之前的文章介绍过 @AutoConfigureBefore
、@AutoConfigureAfter
的作用是指定配置类加载的顺序,而不是bean的加载顺序,这点要注意,很多人也是疏忽了这点,本文重点分析的就是此部分
案例
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\test.TestConfig2,\test.TestConfig
TestConfig
public class TestConfig {public TestConfig(){System.out.println("====TestConfig====");}@Beanpublic Base base(){System.out.println("====base1====");return new Base(1);}
}
TestConfig2
@AutoConfigureBefore(TestConfig.class)
public class TestConfig2 {public TestConfig2(){System.out.println("====TestConfig2====");}@Beanpublic Base base(){System.out.println("====base2====");return new Base(2);}@Beanpublic Test test(Base base){return new Test(base);}
}
Test
public class Test {private Base base;public Test(Base base){this.base = base;}@PostConstructpublic void init(){System.out.println("====" + base.i + "====");}
}
TestConfig
和TestConfig2
使用自动装配配置TestConfig
和TestConfig2
都生成了类型Base,名字base的bean对象TestConfig2
使用@AutoConfigureBefore
指定在TestConfig
之前进行加载TestConfig2
生成了类型Test,名字test的bean对象并注入了类型Bean的bean对象
结果
====TestConfig2====
====TestConfig====
====base1====
====1====
结论
@AutoConfigureBefore
可以指定TestConfig2
在TestConfig
之前进行生成加载- 但不能指定@Bean生成对象的顺序,这里看到注入的Base类型对象是
TestConfig
生成的
那么要指定bean的加载顺序怎么做?
可以用@ConditionalOnMissingBean
注解
案例中只修改TestConfig
,其余不变
TestConfig
public class TestConfig {public TestConfig(){System.out.println("====TestConfig====");}@Bean@ConditionalOnMissingBeanpublic Base base(){System.out.println("====base1====");return new Base(1);}
}
结果
====TestConfig2====
====base2====
====2====
====TestConfig====
可以看到可以通过@ConditionalOnMissingBean
来控制bean对象的加载顺序