在项目开发中,在使用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
通过这种方式,我们发现达到了我们的预期效果。因此在使用者两个注解时,则需要特别注意。
 
				 
					