孩子学编程的利弊台州关键词优化服务

张小明 2025/12/29 6:06:54
孩子学编程的利弊,台州关键词优化服务,网站开发接入本地天地图,中国域名注册局官网目录 1、介绍 1.1、设计目的 1.2、定义 1.3、作用域 1.4、设计限制 2、应用 2.1、使用场景 2.2、工作原理 2.3、实战示例 3、常见误区与最佳实践 3.1、最佳实践 3.2、常见误区 3.3、与其他顺序控制注解对比 前沿 控制 Spring Boot 自动配置顺序#xff1a; “我…目录1、介绍1.1、设计目的1.2、定义1.3、作用域1.4、设计限制2、应用2.1、使用场景2.2、工作原理2.3、实战示例3、常见误区与最佳实践3.1、最佳实践3.2、常见误区3.3、与其他顺序控制注解对比前沿控制 Spring Boot 自动配置顺序“我的自定义配置为什么没生效明明加了ConditionalOnBean却还是报NoSuchBeanDefinitionException”如下所示如果你也曾被这类问题困扰那很可能不是条件注解写错了而是自动配置的执行顺序出了问题。在 Spring Boot 的自动装配体系中时机决定一切。而 AutoConfigureBefore和AutoConfigureAfter正是你掌控这一时机的“时间控制器”。背景为什么需要控制自动配置顺序Spring Boot 的魅力在于“约定优于配置”其核心是自动配置Auto-configuration——通过 spring.factories 或 AutoConfiguration.imports声明一系列 Configuration 类在应用启动时按需加载。但现实世界并非理想模型。多个自动配置类之间往往存在隐式依赖关系我的 AuditLogAutoConfiguration 需要 DataSource我的 CustomRedisTemplate 要覆盖默认实现我的 TraceInterceptor 必须在 Spring MVC 初始化之后注册如果没有顺序控制Spring 容器可能在 DataSource 还未创建时就尝试初始化你的 AuditService导致启动失败。于是Spring Boot 提供了 AutoConfigureBefore和AutoConfigureAfter—— 它们不是“可选项”而是构建可靠自动配置的必备工具。1、介绍1.1、设计目的Spring Boot 的自动配置基于 条件装配Conditional但多个自动配置类之间可能存在隐式依赖“我的自动配置必须在 DataSourceAutoConfiguration 之后运行因为我要注入DataSourceBean”如果没有顺序控制Spring 无法保证 DataSource 已经创建导致启动失败。为了解决自动配置的“依赖顺序”问题AutoConfigureBefore 和 AutoConfigureAfter 就是为此而生。1.2、定义如下所示注解作用AutoConfigureAfter当前自动配置类应在指定类之后执行AutoConfigureBefore当前自动配置类应在指定类之前执行代码如下所示AutoConfigureAfter({DataSourceAutoConfiguration.class, RedisAutoConfiguration.class}) AutoConfigureBefore(WebMvcAutoConfiguration.class) public class MyCustomAutoConfiguration { // ... }1.3、作用域1.AutoConfigureAfter请在我指定的自动配置类之后执行我。代码如下所示AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MyServiceAutoConfiguration { ... }效果确保 MyServiceAutoConfiguration 在 DataSourceAutoConfiguration之后被处理从而能安全地注入 DataSource Bean。2.AutoConfigureBefore“请在我指定的自动配置类之前执行我。代码如下所示AutoConfigureBefore(RedisAutoConfiguration.class) public class CustomRedisTemplateConfiguration { ... }效果确保你的 RedisTemplate 先于 Spring Boot 默认配置注册从而通过 Primary 或ConditionalOnMissingBean 实现覆盖。1.4、设计限制仅作用于自动配置类这两个注解只影响被 Spring Boot 自动配置机制管理的类即1、在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsSpring Boot 3.x2、或META-INF/spring.factoriesSpring Boot 2.x中声明的配置类它们对普通Configuration类无效普通 Bean 的依赖应使用 DependsOn。2、应用2.1、使用场景场景1依赖其他自动配置创建的 Bean需求自定义一个 UserService它依赖 DataSource。代码如下所示Configuration AutoConfigureAfter(DataSourceAutoConfiguration.class) // 必须在 DataSource 之后 public class UserServiceAutoConfiguration { Bean ConditionalOnBean(DataSource.class) // 确保 DataSource 存在 public UserService userService(DataSource dataSource) { return new UserService(dataSource); } }为什么需要AutoConfigureAfterUserService即使有 ConditionalOnBean如果 UserServiceAutoConfiguration 先于 DataSourceAutoConfiguration 执行DataSource 还未注册条件判断会失败UserService 不会被创建。场景2覆盖或增强已有自动配置需求自定义 RedisTemplate替换 Spring Boot 默认的。代码如下所示Configuration AutoConfigureBefore(RedisAutoConfiguration.class) // 在 Redis 自动配置 *之前* 执行 public class CustomRedisTemplateConfiguration { Bean Primary // 覆盖默认 public RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } }为什么用AutoConfigureBefore确保你的 Primary. RedisTemplate 先注册这样当 RedisAutoConfiguration 尝试创建自己的 RedisTemplate 时会因 ConditionalOnMissingBean 条件不满足而跳过。场景3Starter 组件间的依赖需求你开发了一个 my-starter它依赖 spring-boot-starter-data-jpa。在 my-starter 的自动配置类中AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class) public class MyStarterAutoConfiguration { // 使用 JpaRepository }2.2、工作原理Spring Boot 在启动时执行如何排序如下所示3.1、扫描所有自动配置候选类:从 classpath 下的 AutoConfiguration.imports 文件读取全限定类名。Spring Boot 在启动时扫描所有 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports3.2、构建依赖图:解析每个类上的 AutoConfigureBefore、AutoConfigureAfter、AutoConfigureOrder。3.3、拓扑排序:使用 Kahn 算法进行有向无环图DAG排序确保依赖顺序。3.4、按序注册 Bean:依次处理每个自动配置类执行其中的 Bean 方法。⚠️注意这些注解只影响自动配置类之间的顺序不影响普通 Configuration 类2.3、实战示例目标创建一个日志追踪 Starter依赖 Web 自动配置1. 自动配置类Configuration AutoConfigureAfter(WebMvcAutoConfiguration.class) // 必须在 Web 配置之后 ConditionalOnWebApplication public class TraceAutoConfiguration { Bean public TraceInterceptor traceInterceptor() { return new TraceInterceptor(); } Bean public TraceWebMvcConfigurer traceWebMvcConfigurer(TraceInterceptor interceptor) { return new TraceWebMvcConfigurer(interceptor); } }2. WebMvcConfigurer 实现public class TraceWebMvcConfigurer implements WebMvcConfigurer { private final TraceInterceptor interceptor; public TraceWebMvcConfigurer(TraceInterceptor interceptor) { this.interceptor interceptor; } Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(interceptor); } }3. 注册到 spring.factoriesSpring Boot 2.x或 AutoConfiguration.imports3.x# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports com.example.TraceAutoConfiguration效果只有在 Web 环境下才生效确保 WebMvcConfigure 被正确注册到 Spring MVC场景1依赖其他自动配置创建的 Bean需求创建一个审计服务依赖数据库。Configuration AutoConfigureAfter(DataSourceAutoConfiguration.class) // 关键 ConditionalOnClass(JdbcTemplate.class) ConditionalOnBean(DataSource.class) public class AuditServiceAutoConfiguration { Bean public AuditService auditService(DataSource dataSource) { return new AuditService(dataSource); } }为什么必须加AutoConfigureAfter避免因顺序问题导致 ConditionalOnBean 失效。场景2覆盖默认自动配置需求自定义 RedisTemplate使用 JSON 序列化。Configuration AutoConfigureBefore(RedisAutoConfiguration.class) // 在默认配置前执行 public class CustomRedisConfig { Bean Primary public RedisTemplateString, Object redisTemplate( RedisConnectionFactory connectionFactory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } }✅效果Spring Boot 的 RedisAutoConfiguration 会因 ConditionalOnMissingBean(RedisTemplate.class)而跳过自身创建逻辑。场景 3Starter 组件间的协作需求开发一个 my-cache-starter它依赖 spring-boot-starter-data-redis。// my-cache-starter 的自动配置 AutoConfigureAfter(RedisAutoConfiguration.class) ConditionalOnBean(RedisConnectionFactory.class) public class MyCacheAutoConfiguration { Bean public MyCacheService cacheService(RedisTemplate redisTemplate) { return new MyCacheService(redisTemplate); } }优势用户只需引入你的 Starter无需关心底层 Redis 是否已配置。3、常见误区与最佳实践3.1、最佳实践1. 组合使用多个类AutoConfigureAfter({ DataSourceAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class })2. 配合 AutoConfigureOrder 做全局排序AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE 10) AutoConfigureAfter(LoggingAutoConfiguration.class) public class TracingAutoConfiguration { ... }3. 优先使用条件注解而非强依赖顺序// 更健壮的方式 ConditionalOnBean(DataSource.class) AutoConfigureAfter(DataSourceAutoConfiguration.class) // 双重保险❌ 避免循环依赖// A.java AutoConfigureAfter(B.class) // B.java AutoConfigureAfter(A.class) // 启动失败3.2、常见误区误区 1以为能控制任意 Bean 的顺序AutoConfigureAfter只控制自动配置类的执行顺序不能控制普通 Bean 的创建顺序。普通 Bean 用 DependsOn 或 Order。误区 2过度使用导致循环依赖// A.java AutoConfigureAfter(B.class) // B.java AutoConfigureAfter(A.class) // 循环依赖最佳实践优先使用ConditionalOnBean而非强依赖顺序只在必要时使用如确实需要前置 Bean明确指定具体类避免模糊依赖配合AutoConfigureOrder做更精细控制值越小越先执行3.3、与其他顺序控制注解对比如下所示AutoConfigureOrder注解作用范围适用场景AutoConfigureBefore/After自动配置类之间Starter 开发、定制 AutoConfigOrder同类 Bean 排序如 Interceptor、Filter定义拦截器执行顺序DependsOn任意 Bean 依赖强制 A 在 B 之前初始化AutoConfigureOrder自动配置类全局排序设置基础配置如日志最先执行能用条件注解决不用顺序控制必须用时优先选AutoConfigureAfter。总结问题答案什么时候用AutoConfigureAfter当你的自动配置依赖其他 AutoConfig 创建的 Bean什么时候用AutoConfigureBefore当你要覆盖或拦截其他 AutoConfig 的行为能否控制普通配置类❌ 不能仅限自动配置类是否必须使用否但能避免 ConditionalOnBean 失效自动配置的顺序:决定了 Spring Boot 应用的“装配逻辑”。而 AutoConfigureBefore/After就是你手中的“装配指南针”。合理使用它们你的 Starter 将更加健壮、可组合、可预测。参考文章1、SpringBoot之AutoConfigureBefore、AutoConfigureAfter、AutoConfigureOrder注解
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

花店网站建设个人小结东莞网站建设 家具

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

张小明 2025/12/29 6:06:52 网站建设

做图在哪个网站上找做英德红茶的网站

还在为毕业论文的参考文献格式而烦恼吗?面对GB/T 7714标准的复杂要求,许多研究者在文献排版上耗费了大量时间。今天介绍的这款BibTeX样式库,将彻底改变你的参考文献管理体验。🎯 【免费下载链接】gbt7714-bibtex-style GB/T 7714-…

张小明 2025/12/29 6:06:17 网站建设

德州有做网站的工程建设科学技术奖申报网站

Spring中邮件支持:MIME消息的构建与发送 在邮件发送的应用场景中,我们常常会遇到各种需求。有时候,邮件可能只是简单的文本消息,但更多时候,我们需要发送包含HTML格式、嵌入式图片、附件等复杂内容的邮件。接下来,我们将详细探讨如何在Spring框架中构建和发送这些复杂的…

张小明 2025/12/29 6:05:44 网站建设

唐山做网站建设公司wordpress支持小程序吗

终极指南:5步掌握微信小助手核心功能 【免费下载链接】WeChatPlugin-MacOS 微信小助手 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPlugin-MacOS 还在为错过的撤回消息而懊恼?被海量群聊信息淹没却找不到重点?微信小助手正是…

张小明 2025/12/29 6:04:38 网站建设

外贸网站排行wordpress页面上显示地图

HDFS(Hadoop分布式文件系统)的读写流程设计体现了其高容错、高吞吐量的特点。以下是核心流程解析:一、HDFS 写流程(客户端写入数据) 1. 客户端发起请求 客户端调用 FileSystem.create() 方法,通过 HDFS Cli…

张小明 2025/12/29 6:04:04 网站建设

网站建设学院品牌推广与传播

目录已开发项目效果实现截图已开发项目效果实现截图开发技术系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部…

张小明 2025/12/29 6:03:31 网站建设