Java:SpringBoot系列——第三章 自动配置的原理分析

SpringBoot系列——第三章 自动配置原理分析



前言

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应用的启动类

②调用SpringApplicationrun()方法

③调用SpringApplicationgetSprigFactoriesIstaces()方法

④调用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值