• 欢迎来到Compiler网站,如果对网站内容感兴趣或者帮助到你,请为文章点赞,谢谢!

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

java 奔跑的蜗牛 2周前 (09-06) 38次浏览 已收录 0个评论
文章目录[隐藏]

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

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

 


Compiler编程笔记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:@AutoConfigureAfter与@AutoConfigureBefore为什么会失效?
喜欢 (2)
[阳光路上]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址