SpringBoot系列——第三章 自动配置原理分析
文章目录
- SpringBoot系列——第三章 自动配置原理分析
- 前言
- 一、starter介绍
- 1. starter依赖
- 2. starter配置
- 3. 案例
- 3.1 添加starter依赖
- 3.2 在service中可以直接注入redis
- 二、Java配置方式
- 1. Spring版本发展
- 1.1 Spring 1.x
- 1.2 Spring 2.x
- 1.3 Spring 3.x
- 2. xml配置
- 3. 注解配置
- 4. Java配置
- 三、SpringBoot的自动配置
- 1. SpringBoot启动类
- 1.1 启动类注解
- 1.2 启动类方法
- 2. SpringBoot的全局配置文件
- 1. 基于peoperties配置
- 2. 基于yaml的配置
- 3. 常用的全局配置
前言
SpringBoot自动配置原理的分析
一、starter介绍
一个starter就是一个开发场景的支持(
依赖 + 配置
)SpringBoot为我们提供了简化企业级开发绝大多数场景的支持(提供多个starter),我们
在进行项目开发的过程中只需引入对应的starter
(创建SpringBoot应用时可选择),相关的依赖和配置就会被内置到项目中
(消除人工配置)
1. starter依赖
一个starter依赖
表示的不是一个依赖,而是某种开发环境所需的一组依赖
- Spring Web ---- spring-boot-starter-web
- MyBatis Framework — mybatis-spring-boot-starter
- mybatis-spring-boot-starter
2. starter配置
一个starter
不仅包含所需依赖,还包含了其所需的对应配置
- mybatis-spring-boot-starter
3. 案例
引入redis开发场景
3.1 添加starter依赖
- pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.2 在service中可以直接注入redis
- UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDAO userDAO;
@Resource
private StringRedisTemplate redisTemplate;
}
二、Java配置方式
如果我们需要在SpringBoot应用中整合一种新的开发场景,只需在pom.xml引入对应的starter即可
·一个starter不仅包含依赖,还包含相应的配置;
starter中包含的配置都是通过Java类实现的---Java配置方式
1. Spring版本发展
随着Spring’版本的迭代,配置方式也在发生变化
1.1 Spring 1.x
- 所有的bean的配置只能通过xml
1.2 Spring 2.x
- 基于JDK1.5对注解的支持,Spring 2.x开始支持注解
- 企业开发中到底是用xml配置还是注解配置?
- 对基础配置、引用的第三方依赖中的配置使用xml完成:例如数据源配置
- 业务开发使用注解:例如controller、service
1.3 Spring 3.x
- Spring开始提供基于Java的配置方式
2. xml配置
<!-- applicationContext.xml -->
<bean id="stu" class="com.xiaoqing.beans.Student"></bean>
3. 注解配置
@Component
public class Student(){
}
4. Java配置
一般用来配置第三方类,将第三方类交给Spring管理
- 创建配置类
@Configuration //声明该类为配置类
public class SpringConfig{
@Bean //将Date交给Spring管理
public Date getDate(){
return new Date();
}
}
三、SpringBoot的自动配置
完成SpringBoot自动配置需要的条件
- 引入相关依赖
- 完成相关配置(有的是默认配置)
1. SpringBoot启动类
、
1.1 启动类注解
@SpringBootApplication继承了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
- @SpringBootConfiguration 继承了@Configuration,表示
启动类同时也作为一个配置类使用
- @EnableAutoConfiguration
启动Spring内置的自动配置功能
- @ComponentScan
扫描bean 扫描范围为当前应用启动类所在的包
1.2 启动类方法
启动类方法的调用链:
①运行SpringBoot应用的
启动类
②调用
SpringApplication
的run()
方法③调用
SpringApplication
的getSprigFactoriesIstaces()
方法④调用
SpringFactoiesLoader
中的loadFactorNames()
方法⑤调用
SpringFactoiesLoader
中的loadSpringFactories()
中的方法⑥
loadSpringFactories
调用了classLoader的getResources()方法
,"META-INF/spring,factories
"参数
扫描所有依赖中的META-INF目录中的spring,factories文件,该文件包含了当前环境的自动配置类路径。获取到所有配置类的路径
⑦当获取当所有自动配置类路径直接,就会
依次扫描并加载这些自动配置类
⑧依次
判断是否满足配置类的初始化条件,如果不满足则跳过,如果满足则进行初始化
案例:mybatis-spring-boot-starter的自动配置
①扫描所有META-INF中的spring,factories文件
②SpringBoot获取mybatis自动配置类的路径
③加载mybatis自动配置类
④判断是否自动配置
2. SpringBoot的全局配置文件
SpringBoot针对不同的开发场景
提供默认的属性配置
,如果默认的配置不能满足开发的需要,我们需要对属性配置进行修改
SpringBoot提供了一个
全局配置文件application.properties,用于自定义配置
全局配置文件支持两种语法配置
- properties键值对配置
- yaml语法配置
1. 基于peoperties配置
# 配置数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据库驱动版本5.1.47
spring.datasource.url=jdbc:mysql://localhost:3306/db6
# 数据库驱动版本8.0.31
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
## 配置mapper映射文件路径
mybatis.mapper-locations=classpath:mappers/*Mapper.xml
## 配置实体类的包名
mybatis.type-aliases-package=com.xiaoqing.springbootdemo01.bean
2. 基于yaml的配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/db6
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
mybatis:
config-location: classpath:mappers/*Mapper.xml
type-aliases-package: com.xiaoqing.springbootdemo01.bean
3. 常用的全局配置
# http://localhost:9999/demo01/user/list
# 配置端口号
server.port=9999
# 配置项目名
server.servlet.context-path=/demo01