在WebMvcAutoConfiguration加载后,在它之后其实还有很多配置会尝试执行,例如:
@AutoConfigureAfter(WebMvcAutoConfiguration.class) class FreeMarkerServletWebConfiguration extends AbstractFreeMarkerConfiguration { ... } @AutoConfigureAfter(WebMvcAutoConfiguration.class) public class GroovyTemplateAutoConfiguration { ... } @AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class }) public class ThymeleafAutoConfiguration { ... } @AutoConfigureAfter(WebMvcAutoConfiguration.class) public class LifecycleMvcEndpointAutoConfiguration { ... }
这些都很容易理解:如果都不是Web环境,加载一些模版引擎的并无必要嘛。
三大注解使用的误区(重要)
根据我的切身体会,针对这三大注解,实在有太多人把它误用了,想用但是用了却又不生效,于是就容易触发一波“骂街”操作,其实这也是我书写本文的最大动力所在:纠正你的错误使用,告诉你正确姿势。
错误使用示例
我见到的非常多的小伙伴这么来使用三大注解:我这里使用“伪代码”进行模拟
@Configuration public class B_ParentConfig { B_ParentConfig() { System.out.println("配置类ParentConfig构造器被执行..."); } } @Configuration public class A_SonConfig { A_SonConfig() { System.out.println("配置类SonConfig构造器被执行..."); } } @Configuration public class C_DemoConfig { public C_DemoConfig(){ System.out.println("我是被自动扫描的配置,初始化啦...."); } } @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args).close(); } }
通过名称能知道我想要的达到的效果是:ParentConfig先加载,SonConfig后加载。(DemoConfig作为一个参考配置,作为日志参考使用即可)
启动应用,控制台打印:
配置类SonConfig构造器被执行... 配置类ParentConfig构造器被执行... 我是被自动扫描的配置,初始化啦....
Son优先于Parent被加载了,这明显不符合要求。因此,我看到很多小伙伴就这么干:
@AutoConfigureBefore(A_SonConfig.class) @Configuration public class B_ParentConfig { B_ParentConfig() { System.out.println("配置类ParentConfig构造器被执行..."); } }
通过@AutoConfigureBefore控制,表示在A_SonConfig之前执行此配置。语义层面上看,貌似没有任何问题,再次启动应用:
配置类SonConfig构造器被执行... 配置类ParentConfig构造器被执行... 我是被自动扫描的配置,初始化啦....