使用@AutoConfigureBefore调整配置顺序竟没生效?(中)

简介: 使用@AutoConfigureBefore调整配置顺序竟没生效?(中)

在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构造器被执行...
我是被自动扫描的配置,初始化啦....





相关文章
|
Java
Java导入Excel
本文介绍如何用Java导入Excel。
940 0
Java导入Excel
|
6月前
|
存储 网络协议 Java
Java获取客户端IP问题:返回127.0.0.1
总结:要解决Java获取客户端IP返回127.0.0.1的问题,首先要找出原因,再采取合适的解决方案。请参考上述方案来改进代码,确保在各种网络环境下都能正确获取客户端IP地址。希望本文对您有所帮助。
463 25
|
安全 测试技术 C#
HttpClientHandler 详解及使用
HttpClientHandler 详解及使用
|
Java 开发者 Spring
深入理解Spring Boot中的自动配置原理
深入理解Spring Boot中的自动配置原理
1689 1
|
Java Unix Linux
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
4732 0
|
SQL 数据库
详解BaseMapper
详解BaseMapper
709 0
|
SQL Java 数据库连接
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
477 0
|
安全 Java Spring
《SpringBoot系列十一》:精讲如何使用@Conditional系列注解做条件装配
《SpringBoot系列十一》:精讲如何使用@Conditional系列注解做条件装配
1233 0
《SpringBoot系列十一》:精讲如何使用@Conditional系列注解做条件装配
|
SoC
高通平台开发系列讲解(SMD篇)图解SMD驱动流程
高通平台开发系列讲解(SMD篇)图解SMD驱动流程
787 0
 高通平台开发系列讲解(SMD篇)图解SMD驱动流程
Zp
org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found.的问题解决办法
org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found.的问题解决办法
Zp
1202 0