Java学习笔记---SpringBoot自动配置
1、父项目依赖管理
<parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.3.4.RELEASE</version> </parent>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.4.RELEASE</version> </parent>
- spring-boot-dependencies 几乎声明了所有开发中常用的依赖
<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-amqp</artifactId> <version>${activemq.version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-blueprint</artifactId> <version>${activemq.version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>${activemq.version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-camel</artifactId> <version>${activemq.version}</version> </dependency> <dependency> ...... </dependencyManagement>
- 开发时导入spring-boot-starter-xxx(xxx即为某个开发场景)
- 常见的如web开发 spring-boot-starter-web、redis spring-boot-starter-data-redis......
- 引入starter-xxx 此场景下所有常规依赖都会自动引入
- 如 xxx-spring-boot-starter 是第三方提供的场景启动器
- 自动版本仲裁,spring-boot-dependencies 中规定了当前依赖的版本(引入依赖时可以不写版本号)
-
<properties> <activemq.version>5.15.13</activemq.version> <antlr2.version>2.7.7</antlr2.version> <appengine-sdk.version>1.9.82</appengine-sdk.version> <artemis.version>2.12.0</artemis.version> <aspectj.version>1.9.6</aspectj.version> <assertj.version>3.16.1</assertj.version> <atomikos.version>4.0.6</atomikos.version> <awaitility.version>4.0.3</awaitility.version> <bitronix.version>2.1.4</bitronix.version> ...... </properties>
- 修改默认版本号(在当前项目pom.xml中重写)
-
<properties> <mysql.version>5.1.43</mysql.version> </properties>
-
2、自动配置
-
- SpringBoot会帮我们自动配置好场景下各种所需项
- 如在web开发场景下:
- 自动引入配置Tomcat
- 自动配置SpringMVC
- 自动配好Web常用组件(如 :字符编码过滤器)
- 拥有默认的包结构,无需配置包扫描
- 默认进行包扫描 主程序所在包以及其所有子包下
- 改变默认扫描路径
- @SpringBootApplication( scanBasePackages = "包路径" )
- @ComponentScan ( "包路径" )
- 如在web开发场景下:
- @SpringBootApplication注解
- 等同于
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan( "包路径" )
- 等同于
- SpringBoot各种场景下的自动配置功能 在 spring-boot-autoconfigure 包里面
- SpringBoot会帮我们自动配置好场景下各种所需项
-
- 加载自动配置类
-
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication{}
三个注解
- @SpringBootConfiguration 表示当前是一个配置类
- @ComponentScan 指定包扫描
- @EnableAutoConfiguration
-
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {}
- @AutoConfigurationPackage :负责保存标注相关注解的类的所在包路径,向容器注入组件,名称是全类名,值是PackageImports,里面包含一个集合,集合中存储packageNames,也就是我们注解所在包。说白了,就是把我们注解所在包路径加入了容器一个专门记录packageNames的集合里
官方注解说明: (Class for storing auto-configuration packages for reference later (e.g. by JPA entity scanner).)
- @Import(AutoConfigurationImportSelector.class): 从classpath搜寻所有META-INF/spring.factories文件,借助SpringFactoriesLoader来根据autoConfigurationMetadata加载符合条件的AutoConfiguration。
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF / spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
-
- 最后按需开启自动配置( 按照条件装配规则(@Conditional),最终会按需配置。 )
-
- 总结 and 其他
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
- 加载自动配置类
3、开发工具
-
-
Lombok : 简化JavaBean开发
-
dev-tools : 热部署,修改后 ctrl + f9 重新编译即生效
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构