spring · 6 9 月, 2021 0

@AutoConfigureAfter与@AutoConfigureBefore为什么会失效?

在项目开发中,在使用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

通过这种方式,我们发现达到了我们的预期效果。因此在使用者两个注解时,则需要特别注意。