Spring Boot的自动配置原理
一、引导加载自动配置类@SpringBootApplication
@SpringBootApplication是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan注解的合成注解。
1、@SpringBootConfiguration
打开里面是@Configuration注解,代表当前启动类也是一个配置类
2、@ComponentScan
Spring注解,指定包扫描规则
3、@EnableAutoConfiguration
打开@EnableAutoConfiguration,里面有以下两个注解:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
3.1 @AutoConfigurationPackage
里面有@Import({Registrar.class})
,利用Registrar
将MainApplication所在包下的所有组件都导入容器中。
3.2 @Import({AutoConfigurationImportSelector.class})
可以从META-INF/spring.factories位置来加载一个文件:默认扫描当前项目中所有META-INF/spring.factories位置的文件。
二、按需开启自动配置项
虽然127个场景的所有自动配置在启动的时候默认全部加载,但是会通过@Conditional条件装配进行按需加载。
三、修改默认配置
SpringBoot默认会在底层配好所有的组件,但如果用户配置了,以用户的配置优先。
总结:
-
Spring Boot会先加载所有的自动配置类,eg: xxxxAutoConfiguration
-
每个自动配置类按照@Conditional条件进行生效,并从xxxxProperties取值,xxxxProperties与配置文件绑定。
-
生效的配置类会向容器中装配很多组件
-
手动配置默认组件:(一般使用第二种方法)
- 用@Bean替换底层的组件
- 看该组件在配置文件中获取的变量名,修改application.properties里该变量的值
xxxxAutoConfiguration——>组件——>xxxxProperties里面取值——>application.properties配置文件
最佳实践
-
引入对应场景依赖:
-
查看自动配置了哪些(选做)
- 自己分析,引入场景对应的配置类一般都生效了
- 配置文件中加入
debug=true
,开启自动配置报告。打印台会输出:Negative表示该配置类不生效,Positive表示生效。
-
是否需要修改
-
参照文档修改配置:
-
自己分析,xxxxProperties绑定了配置文件的哪些变量。
-
-
自定义加入或者替换组件
- @Bean、@Component
-
自定义器xxxxCustomizer
开发技巧
1、Lombok——简化JavaBean开发
常用的lombok注解有以下:
@Data:生成已有属性的getter和setter方法,在程序编译的时候自动生成,原代码中不显示
@ToString:重写toString方法
@EqualsAndHashCode:重写hashcode方法
@AllArgsConstructor:全参构造器
@NoArgsConstructor:无参构造器
2、Spring Initializr
快速创建一个Spring Boot项目,不用自己引入starter。
Mybatis Generator&通用Mapper
一、Mybatis Generator
---Mybatis提供的代码生成工具,通过配置generatorConfig.xml文件,执行MyBatis Generator命令,即可自动生成以下三类文件:
- 持久化对象(PO),也叫实体文件,可以在配置文件中设置一个数据库表对应生成一个PO类
- 操作数据库的接口(DAO),数据库操作方法都在此接口中定义,Mapper类
- CRUD sql的Mapper XML配置文件
二、generatorConfig.xml文件
文件结构如下,<generatorConfiguration>以及<context>下的子元素都有严格的顺序。
更详细的解释见:https://blog.csdn.net/isea533/article/details/42102297
1、配置文件头
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
2、根节点:<generatorConfiguration>,无任何属性,中间写配置
<generatorConfiguration>
<context>
<property>...</property>
<!-- 定义插件 -->
<plugin>...</plugin>
<!-- 注释 -->
<commentGenerator> ... </commentGenerator>
<!-- jdbc连接 -->
<jdbcConnection> ... </jdbcConnection>
<!-- 类型转换 -->
<javaTypeResolver> ... </javaTypeResolver>
<!-- 生成实体类配置 -->
<javaModelGenerator> ... </javaModelGenerator>
<!-- 生成Mapper.xml文件配置 -->
<sqlMapGenerator> ... </sqlMapGenerator>
<!-- 生成Mapper.java 接口-->
<javaClientGenerator> ... </javaClientGenerator>
<!-- schema为数据库名,tableName为对应的数据库表名 -->
<table> ... </table>
</context>
</generatorConfiguration>
三、通用Mapper
在generatorConfig.xml文件的<context>元素下增加<plugin>元素,type属性可以设置为通用Mapper。在<plugin>元素下设置子元素<property>,可以添加一些自定义配置,自动生成注解和自动添加lombok注解。
<!-- 使用通用mapper提供的插件 -->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<!-- 所有mapper继承的通用mapper,如果对mapper有进行扩展,可以修改此值 -->
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
<property name="forceAnnotation" value="true"/>
<property name="lombok" value="Data"/>
</plugin>