使用@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。
905 0
Java导入Excel
|
安全 NoSQL Java
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤(二)
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤
1189 0
|
4月前
|
存储 网络协议 Java
Java获取客户端IP问题:返回127.0.0.1
总结:要解决Java获取客户端IP返回127.0.0.1的问题,首先要找出原因,再采取合适的解决方案。请参考上述方案来改进代码,确保在各种网络环境下都能正确获取客户端IP地址。希望本文对您有所帮助。
283 25
|
消息中间件
RabbitMQ 死信消息队列 重复消费 basicAck basicNack
RabbitMQ 死信消息队列 重复消费 basicAck basicNack
|
监控 安全 Shell
清除阿里云服务器挖矿病毒总结
监控发现`top`命令显示`xmrig`进程占满CPU,确认服务器遭挖矿病毒感染。通过`thistory`追溯到病毒执行步骤,包括下载恶意脚本、设置定时任务等。处理方案包括:清理异常定时任务并修复权限;查找并删除挖矿相关文件;识别并终止可疑`sh`进程;加强SSH安全,如修改端口、清除密钥、限制IP访问等,以彻底清除病毒并加固系统安全。
1543 2
|
Java 开发者 Spring
深入理解Spring Boot中的自动配置原理
深入理解Spring Boot中的自动配置原理
1027 1
|
Java Spring
Spring的Bean生命周期中@PostConstruct注解
【8月更文挑战第3天】在Spring框架中,`@PostConstruct`注解标示Bean初始化完成后立即执行的方法。它在依赖注入完成后调用,适用于资源加载、属性设置等初始化操作。若方法中抛出异常,可能影响Bean初始化。与之对应,`@PreDestroy`注解的方法则在Bean销毁前执行,用于资源释放。
347 0
Intellij IDEA运行报Command line is too long的解决办法
Intellij IDEA运行报Command line is too long的解决办法
1178 1
|
网络安全 Docker 容器
Docker常见问题1: driver failed programming external connectivity on endpoint
Docker常见问题1: driver failed programming external connectivity on endpoint
|
消息中间件 Java RocketMQ
Springboot整合RocketMQ 基本消息处理
1. 同步消息 2. 异步消息 3. 单向消息 4. 延迟消息 5. 批量消息 6. 顺序消息 7. Tag过滤 8. 广播消息
424 0