深入探索Spring Boot的自动配置机制

深入探索Spring Boot的自动配置机制

在上一篇中,我们介绍了Spring Boot的自动配置机制及其基本工作原理。这篇文章将进一步扩展这一主题,深入探讨自动配置的内部实现、常见的自动配置类、以及如何通过高级自定义来优化Spring Boot应用的配置。

1. 自动配置的核心组件

Spring Boot的自动配置依赖于一系列核心组件和概念:

  1. spring.factories文件
    Spring Boot在启动时会扫描类路径下的META-INF/spring.factories文件,找到所有配置在EnableAutoConfiguration下的类。

    # META-INF/spring.factories
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    ...
    
  2. 自动配置类
    自动配置类是带有@Configuration注解的类,它们包含了条件性的Bean定义。

  3. 条件注解
    条件注解用于在特定条件满足时才创建或配置Bean,如@ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty等。

2. 深入了解条件注解

条件注解是Spring Boot自动配置的关键。以下是一些常见的条件注解及其用法:

  • @ConditionalOnClass
    仅在指定的类存在于类路径中时才配置Bean。

    @ConditionalOnClass(name = "com.example.MyClass")
    public class MyAutoConfiguration {// 配置代码
    }
    
  • @ConditionalOnMissingBean
    仅在指定的Bean不存在时才配置Bean。

    @ConditionalOnMissingBean(DataSource.class)
    @Bean
    public DataSource dataSource() {// 配置代码
    }
    
  • @ConditionalOnProperty
    仅在指定的属性存在且具有特定值时才配置Bean。

    @ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
    @Bean
    public MyFeature myFeature() {// 配置代码
    }
    
3. 常见的自动配置类

Spring Boot提供了丰富的自动配置类,用于不同的功能模块。以下是一些常见的自动配置类及其功能:

  • WebMvcAutoConfiguration
    配置Spring MVC相关的默认设置,包括DispatcherServlet、视图解析器等。

  • DataSourceAutoConfiguration
    配置数据源,包括连接池、事务管理等。

  • JpaRepositoriesAutoConfiguration
    配置JPA相关的设置和Spring Data JPA的仓库支持。

  • SecurityAutoConfiguration
    配置Spring Security的默认设置,包括基础的安全过滤器链。

4. 高级自定义自动配置

尽管Spring Boot的自动配置极大地简化了开发工作,有时我们需要对默认配置进行细粒度的控制。以下是几种高级自定义的方法:

4.1. 自定义自动配置

如果需要自定义某个自动配置组件,可以定义一个新的@Configuration类并覆盖默认的Bean定义。例如,自定义数据源配置:

@Configuration
public class CustomDataSourceConfig {@Beanpublic DataSource dataSource() {HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/customdb");dataSource.setUsername("customuser");dataSource.setPassword("custompassword");dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");return dataSource;}
}

Spring Boot会优先使用自定义的DataSource,而不会使用默认的自动配置。

4.2. 禁用特定自动配置

如果不需要某些自动配置类,可以在@SpringBootApplication注解中使用exclude属性禁用它们:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
4.3. 使用@ConditionalOnProperty进行细粒度控制

可以通过@ConditionalOnProperty注解,根据配置文件中的属性值来决定是否启用某个自动配置。

@Configuration
@ConditionalOnProperty(name = "myapp.customfeature.enabled", havingValue = "true")
public class CustomFeatureAutoConfiguration {@Beanpublic CustomFeature customFeature() {return new CustomFeature();}
}

application.properties文件中:

myapp.customfeature.enabled=true
5. 示例:构建自定义的自动配置

假设我们希望为应用程序添加一个自定义的功能模块,并通过Spring Boot的自动配置机制来管理其配置。

5.1. 创建自定义配置类
@Configuration
@ConditionalOnClass(MyService.class)
@ConditionalOnProperty(name = "myapp.myfeature.enabled", havingValue = "true")
public class MyFeatureAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService() {return new MyServiceImpl();}
}
5.2. 配置文件

application.properties文件中启用自定义功能:

myapp.myfeature.enabled=true
5.3. 验证配置

启动应用程序,检查自定义功能是否被正确配置:

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

通过上述步骤,我们创建了一个自定义的自动配置模块,并通过配置文件启用或禁用该模块。这展示了Spring Boot自动配置机制的强大和灵活性。

总结

Spring Boot的自动配置机制通过Starter依赖、条件注解和自动配置类等技术,极大地简化了Spring应用的开发过程。通过深入理解和利用这些机制,我们可以更高效地开发Spring应用,并快速构建功能完备的企业级应用程序。无论是使用默认配置还是自定义配置,Spring Boot都提供了足够的灵活性和控制力,使开发者能够专注于业务逻辑,而不必为繁琐的配置所困扰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity与Js通信交互

目录 1.Js给Unity传递消息 2.Unity给Js传递消息 简介: Unity 与 JavaScript 通信交互是指在 Unity 项目中实现与 JavaScript 代码进行数据交换和功能调用的过程。 在 Unity 中,可以通过特定的接口和技术来与外部的 JavaScript 环境进行连接。这使得 Unity 能够利…

Python CGI 编程

Python CGI 编程 1. 引言 CGI,即通用网关接口(Common Gateway Interface),是一种重要的互联网技术,它允许服务器上的程序与客户端(通常是浏览器)进行交互。Python作为一种流行的编程语言,因其简洁易读的语法和强大的功能,被广泛用于CGI编程。本文将详细介绍如何使用…

进击算法工程师深度学习课程

"进击算法工程师深度学习课程"旨在培养学员在深度学习领域的专业技能和实战经验。课程涵盖深度学习基础理论、神经网络架构、模型优化方法等内容,通过项目实践和算法实现,帮助学员掌握深度学习算法原理和应用,提升在算法工程师领域…

EasyExcel文件导出,出现有文件但没有数据的问题

一开始由于JDK版本过高,我用的17,一直excel没有数据,表头也没有,后来摸索了好久,找了资料也没有,后来改了代码后报了一个错误(com.alibaba.excel.exception.ExcelGenerateException: java.lang.…

c++【入门】求三个数的平均数

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 小雅刚刚考完语文、数学、英语的三门期中考试,她想请你编个程序来帮她算算她的平均分,要求输入三个正整数,分别表示三科考试的分数,输出它们的平均值。 输入 一行,…

【抽代复习笔记】19-群(十三):奇偶置换、循环置换的几个定理及例题

定义: ①在Sn中,能够表示为奇数多个对换乘积的置换称为“奇置换”,能够表示为偶数多个对换乘积的置换称为“偶置换”; ②所有偶置换的集合记为An。 例1:(1)计算S1和S2中奇、偶置换的数目&…

代码随想录第三十七天打卡

56. 合并区间 本题也是重叠区间问题&#xff0c;如果昨天三道都吸收的话&#xff0c;本题就容易理解了。 代码随想录 class Solution { public:static bool cmp(vector<int>a,vector<int>b){if (a[0]b[0])return a[1]<b[1];return a[0]<b[0];}vector<vec…

数据中台-知识图谱平台

【数据分析小兵】专注数据中台产品领域,覆盖开发套件,包含数据集成、数据建模、数据开发、数据服务、数据可视化、数据治理相关产品以及相关行业的技术方案的分享。对数据中台产品想要体验、做二次开发、关注方案资料、做技术交流的朋友们&#xff0c;可以关注我。 1. 概述 随着…

清理Linux操作系统buff/cache缓存

清理Linux操作系统buff/cache缓存 清理页缓存 echo 1 > /proc/sys/vm/drop_caches 或者 sysctl -w vm.drop_caches1 清理目录项和inode缓存 echo 2 > /proc/sys/vm/drop_caches 或者 sysctl -w vm.drop_caches2 同时清理页缓存、目录项和inode缓存 echo 3 > /pr…

ResNet——Deep Residual Learning for Image Recognition(论文阅读)

1.什么是ResNet ResNet是一种残差网络&#xff0c;咱们可以把它理解为一个子网络&#xff0c;这个子网络经过堆叠可以构成一个很深的网络。下面是ResNet的结构。 2.为什么要引入ResNet 理论上来说&#xff0c;堆叠神经网络的层数应该可以提升模型的精度。但是现实中真的是这…

智慧守护 畅游无忧——北斗应急呼叫柱,为景区安全加码

在大自然的怀抱中&#xff0c;中型及大型公园、景区以其壮丽风光吸引着成千上万的游客前来探索&#xff0c;成为了人们休闲娱乐的好去处。然而&#xff0c;广袤的区域、复杂的地形和分散的人流也给安全保障带来了前所未有的挑战。传统的巡逻方式难以覆盖每一个角落&#xff0c;…

搜维尔科技:使用Haption远距离遥操作精确切割材料

使用Haption远距离遥操作精确切割材料 搜维尔科技&#xff1a;使用Haption远距离遥操作精确切割材料

【第六篇】SpringSecurity的权限管理

一、权限管理的实现 服务端的各种资源要被SpringSecurity的权限管理控制可以通过注解和标签两种方式来处理。 放开了相关的注解后在Controller中就可以使用相关的注解来控制了 JSR250注解 /*** JSR250*/ @Controller @RequestMapping("/user") public class UserC…

物理隔离后数据怎么导入和导出?安全U盘一键解决

政府单位、军工和科研所、航空航天企业、金融机构、医疗单位、电力企业、生物制药实验室等企业及单位&#xff0c;因研发和生产过程、或日常经营中涉及大量敏感信息和技术&#xff0c;需要通过物理隔离来确保网络的安全性。因此&#xff0c;多采用物理隔离的方式进行网络建设。…

前端 CSS 经典:在 Vue3 中使用渐进式图片

1. 什么是渐进式图片 当我们网站会加载很多图片的时候&#xff0c;有些图片尺寸很大&#xff0c;加载就会很慢&#xff0c;会导致页面长时间陷入白屏状态&#xff0c;用户体验很不好。所以可以使用渐进式图片&#xff0c;先给用户展示模糊图&#xff0c;这些图尺寸小&#xff…

django学习入门系列之第二点《浏览器能识别的标签3》

文章目录 列表表格往期回顾 列表 无序列表 <!-- <ul </ul> 无序列表 --> <ul><li> 内容1 </li><li> 内容2 </li><li> 内容3 </li><li> 内容4 </li> </ul>有序列表 <!-- <ol> &…

快速入门Flutter:从零开始构建你的第一个应用

快速入门Flutter&#xff1a;从零开始构建你的第一个应用 Flutter 是一个由 Google 开发的开源框架&#xff0c;用于构建高性能、跨平台的移动应用程序。本文将介绍如何快速入门 Flutter&#xff0c;包括工具下载、环境配置以及创建一个简单的 Demo 应用。 一、环境准备 安装…

WordPress、Typecho 站点如何让 CloudFlare 缓存加速

众所周知 WordPress、Typecho 都是著名动态博客站点(一个最简单的判断依据就是都要依赖结合数据库),这类站点在 CDN 缓存上都有一个致命的缓存弊端就是动静态请求的区分,理论上要让 CDN 绕过所有的动态请求,缓存所有的静态请求,否则就会造成前端登录和非登录状态的混乱,…

小程序制作成本是多少?揭秘隐藏费用!

在日常生活中&#xff0c;有很多小程序&#xff0c;其中我们最熟悉的是微信小程序&#xff0c;所以小程序对我们每个人来说并不陌生。那么&#xff0c;你知道制作一个小程序要花多少钱吗&#xff1f;制作小程序的成本是多少&#xff1f;今天&#xff0c;本文将带领您揭示小程序…

禁渔期水域监管:EasyCVR视频智能监控方案

一、背景与需求分析 根据农业部印发的《中国渔政亮剑2024系列专项执法行动方案》&#xff0c;我国将持续推进长江十年禁渔、海洋伏季休渔、黄河等内陆重点水域禁渔等专项行动。根据四川省相关规定&#xff0c;每年3月1日至6月30日为禁渔期&#xff0c;在此期间&#xff0c;四川…