在项目开发中,在使用spring-boot时,有时会希望通过注解的方式,来控制装配的顺序。在查看源码过程中,发现有@AutoConfigureAfter
与@AutoConfigureBefore
两个注解能够实现。因此写两个DEMO实现功能用作测试。
注解区分
我初次使用时,让我产生了误区,具体装配执行顺序的,一下说明:
@AutoConfigureBefore
: 该注解的作用载体为当前Configuration
类,配置在AutoConfigureBefore
中的类,会比当前Configuration类后装配执行@AutoConfigureAfter
:该注解的作用载体为当前Configuration
类,配置在AutoConfigureAfter
中的类,会比当前Configuration类先装配执行
DEMO代码
@Configuration public class TestConfiguration { @Bean public TestBean testBean() { return new TestBean("TestConfiguration"); } }
@Slf4j public class TestBean { public TestBean(String desc) { log.info(desc); } }
@Configuration @AutoConfigureAfter({TestConfiguration.class}) public class AutoConfigureAfterConfiguration { @Bean public TestBean afterBean() { return new TestBean("AutoConfigureAfterConfiguration"); } }
@Configuration @AutoConfigureBefore({TestConfiguration.class}) public class AutoConfigureBeforeConfiguration { @Bean public TestBean beforeBean() { return new TestBean("AutoConfigureBeforeConfiguration"); } }
@SpringBootApplication public class SpringAutoConfigureDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringAutoConfigureDemoApplication.class, args); } }
以上代码的顺序期望为: AutoConfigureBeforeConfiguration
-> TestConfiguration
-> AutoConfigureAfterConfiguration
.
当时当我们执行程序时,却发现与我们预期不一致,具体日志如下:
2021-09-06 17:54:06.177 INFO 92348 --- [ main] org.spring.learn.TestBean : AutoConfigureAfterConfiguration 2021-09-06 17:54:06.179 INFO 92348 --- [ main] org.spring.learn.TestBean : AutoConfigureBeforeConfiguration 2021-09-06 17:54:06.181 INFO 92348 --- [ main] org.spring.learn.TestBean : TestConfiguration
如何解决?
通过查阅资料发现,在Spring-boot自动扫描的路径中,这两个注解是会失效,并不会产生预期的效果。因此我们将这两个类移除spring boot application的自动扫描路径,并通过spring.factories
的文件配置的方式,来加载这几个Configuration类,spring.factories配置如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.spring.learn.autoconfigure.AutoConfigureAfterConfiguration,\ org.spring.learn.autoconfigure.AutoConfigureBeforeConfiguration,\ org.spring.learn.autoconfigure.TestConfiguration
当我们再次启动SpringAutoConfigureDemoApplication
类型时,输出日志如下:
2021-09-06 18:17:18.596 INFO 97204 --- [ main] org.spring.learn.TestBean : AutoConfigureBeforeConfiguration 2021-09-06 18:17:18.598 INFO 97204 --- [ main] org.spring.learn.TestBean : TestConfiguration 2021-09-06 18:17:18.599 INFO 97204 --- [ main] org.spring.learn.TestBean : AutoConfigureAfterConfiguration
通过这种方式,我们发现达到了我们的预期效果。因此在使用者两个注解时,则需要特别注意。