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

java 自动改变内容吗 java自动配置_java 自动改变内容吗

2. starter配置

一个starter不仅包含所需依赖,还包含了其所需的对应配置

  • mybatis-spring-boot-starter

java 自动改变内容吗 java自动配置_xml_02

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自动配置需要的条件

  • 引入相关依赖
  • 完成相关配置(有的是默认配置)

java 自动改变内容吗 java自动配置_java_03

1. SpringBoot启动类


java 自动改变内容吗 java自动配置_spring_04

1.1 启动类注解

@SpringBootApplication继承了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

  • @SpringBootConfiguration 继承了@Configuration,表示启动类同时也作为一个配置类使用
  • @EnableAutoConfiguration 启动Spring内置的自动配置功能
  • @ComponentScan 扫描bean 扫描范围为当前应用启动类所在的包

1.2 启动类方法

启动类方法的调用链:

①运行SpringBoot应用的启动类

②调用SpringApplicationrun()方法

③调用SpringApplicationgetSprigFactoriesIstaces()方法

④调用SpringFactoiesLoader中的loadFactorNames()方法

⑤调用SpringFactoiesLoader中的loadSpringFactories()中的方法

loadSpringFactories调用了classLoader的getResources()方法,"META-INF/spring,factories"参数

扫描所有依赖中的META-INF目录中的spring,factories文件,该文件包含了当前环境的自动配置类路径。获取到所有配置类的路径

⑦当获取当所有自动配置类路径直接,就会依次扫描并加载这些自动配置类

⑧依次判断是否满足配置类的初始化条件,如果不满足则跳过,如果满足则进行初始化

java 自动改变内容吗 java自动配置_spring_05

案例:mybatis-spring-boot-starter的自动配置

①扫描所有META-INF中的spring,factories文件

java 自动改变内容吗 java自动配置_xml_06

②SpringBoot获取mybatis自动配置类的路径

java 自动改变内容吗 java自动配置_spring boot_07

③加载mybatis自动配置类

java 自动改变内容吗 java自动配置_spring boot_08

④判断是否自动配置

java 自动改变内容吗 java自动配置_xml_09

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