springboot自动配置原理以及手动实现配置类

1、原理

spring有一个思想是“约定大于配置”。

配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot在启动的时候可以把一些配置类自动注入到spring的IOC容器里,项目运行之后就可以直接使用这些配置类的属性和方法等。

springboot有一个全局配置文件,application.properties / application.yml,各种属性都可以在文件中进行自定义配置。

自动配置实现原理:

我们都知道项目的入口是 @SpringBootApplication 注解,这个注解标识了该类是springboot的启动类,那我们就从它入手一探究竟。

我们可以看到这个注解是一个复合注解,其中的 @EnableAutoConfiguration 注解表示开启自动配置,这个注解也是复合注解。

我们可以看到它导入了一个名为AutoConfigurationImportSelector的类,那么这个类的作用是什么呢?

我们继续往下看,可以看到 selectImports( ) 方法

selectImports 这个方法通过调用 SpringFactoriesLoader.loadFactoryNames() 方法扫描spring-boot-autoconfigure-xxx.jar/META-INF路径下的 spring.factories文件,通过类的全路径拿到需要配置的类名,然后通过反射将其全部注入IOC容器中。

每个配置类都有一些属性,XXXAutoConfiguration自动配置类,会有一个@EnableConfigurationProperties注解,它的参数是一个XXXProperties类,该注解的作用是把XXXProperties类的实例加载到Spring的IOC容器中,而XXXProperties类中的属性就是自动配置的属性。

XXXProperties类有一个注解@ConfigurationProperties,该注解可以扫描全局配置文件application.properties或者application.yml文件中以prefix开头的一组配置绑定到DataSourceProperties实例的属性上,实现自动配置。

// 全局扫描注入 配置文件中以spring.datasource开头的值
@ConfigurationProperties(
prefix = "spring.datasource"
)

2、手动写一个自动配置类

有了上面的理解,我们可以自己动手写一个自动配置类。

自动配置类做的事情就是把@EnableConfigurationProperties注解标识的类注入到IOC容器。

2.1、所以我们先写一个自动配置类SeviceAutoConfiguration

package com.ycw.autoconfig.configuration;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration; /**
* @author Administrator
* @date 2022-09-30 21:51
*/
@Slf4j
@Configuration // 自动配置类
@EnableConfigurationProperties(ServiceProperties.class) // 标识XXXProperties类的实例
public class SeviceAutoConfiguration { }

2.2、写真正要加入容器的类ServiceProperties

package com.ycw.autoconfig.configuration;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties; /**
* @author Administrator
* @date 2022-09-30 21:50
*/
@Data
@Slf4j
@ConfigurationProperties(prefix = "myconfig") // 扫描全局配置文件完成属性注入
public class ServiceProperties {
private String name;
public void print(){
log.info("自动配置成功! " + name);
}
}

2.3、在resources目录下新建目录META-INF,新建文件spring.factories完成对自动配置类全路径配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ycw.autoconfig.configuration.SeviceAutoConfiguration

2.4、在全局配置文件application.properties中添加属性注入

2.5、写一个Controller测试,ControllerTest

package com.ycw.autoconfig.controller;

import com.ycw.autoconfig.configuration.ServiceProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /**
* @author Administrator
* @date 2022-09-30 21:54
*/
@RestController
public class ControllerTest {
@Resource
private ServiceProperties serviceProperties;
@RequestMapping("test")
public void test(){
serviceProperties.print();
}
}

运行之后我们可以看到:

分析一下这个过程:

  1. 启动类@SpringBootApplication通过spring.factories文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration找到了SeviceAutoConfiguration

  2. @Configuration 注解的类SeviceAutoConfiguration被springboot扫描到后,它所标识的@EnableConfigurationProperties(ServiceProperties.class) 开始进入被注入容器的过程

  3. ServiceProperties 类的注解@ConfigurationProperties(prefix = "myconfig") 使得springboot扫描全局配置文件application.properties

  4. application.properties中的 myconfig.name=yangchuanwei 被注入到属性name中,自此ServiceProperties已经被自动配置成功!


获取demo地址可以关注公众号【靠谱杨的挨踢生活】,回复【autoconfig】获取下载链接。

springboot自动配置原理以及手动实现配置类的更多相关文章

  1. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  2. springboot自动装配原理,写一个自己的start

    springboot自动装配原理 第一次使用springboot的时候,都感觉很神奇.只要加入一个maven的依赖,写几行配置,就能注入redisTemple,rabbitmqTemple等对象. 这 ...

  3. springboot自动装配原理回顾、配置文件分析

    配置文件 spring boot官方文档 官方外部配置文件说明参考文档 自动配置原理分析 1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfigurat ...

  4. SpringBoot自动装配原理解析

    本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...

  5. springboot自动装配原理

    最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...

  6. SpringBoot | 2.1 SpringBoot自动装配原理

    @ 目录 前言 1. 引入配置文件与配置绑定 @ImportResource @ConfigurationProperties 1.1 @ConfigurationProperties + @Enab ...

  7. SpringBoot 自动装配原理

    早期的Spring项目需要添加需要配置繁琐的xml,比如MVC.事务.数据库连接等繁琐的配置.Spring Boot的出现就无需这些繁琐的配置,因为Spring Boot基于约定大于配置的理念,在项目 ...

  8. 【Springboot】Springboot自动装配原理

    1.核心注解就是 EnableAutoConfiguration  该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...

  9. SpringBoot自动装配原理之Configuration以及@Bean注解的使用

    Configuration以及Bean注解的使用 该知识点在Spring中应该学过,没有学过或者遗忘的的朋友需要预习或温习前置知识点.SpringBoot其实就是Spring的进一步简化,所以前置知识 ...

随机推荐

  1. jdbc 04: 配置连接信息

    jdbc连接mysql,将需要的信息配置到文件中 package com.examples.jdbc.o4_配置连接信息; import java.sql.Connection; import jav ...

  2. c:找到出现次数最多的递增数字串

    如题,如何在一亿位整数组成的字符串中找到出现次数最多的递增数字串? 答案: #include <stdio.h> #include <string.h> #define MAX ...

  3. 类型转换_float()函数

    float()函数不能将文字类的字符串类型转换成小数类型 同时将整数转换成浮点数类型的时候会在整数后买你加上.0 print(float(1))//output:1.0 print(float('1' ...

  4. css基础02

    熟练快捷键!方便,要多练!  css复合选择器 不会选孙子,有一个儿子和另一个儿子的孩子(也是孙子)同名了,但子选择器子选择儿子,同名的孙子不选.和后代选择器有一点不一样的. " ,&quo ...

  5. YII页面缓存

    IndexController.php namespace frontend\controllers; use yii; use yii\web\Controller; class IndexCont ...

  6. 关于又拍云免费cdn全网加速服务的长期评测(各种踩坑)

    原文转载自「刘悦的技术博客」 ( https://v3u.cn/a_id_128 ) 妇孺皆知,前端优化中最重要的优化手段之一就是cdn加速,所谓cdn加速就是采用更多的缓存服务器(CDN边缘节点), ...

  7. C#里如何简单的校验时间格式

    前言: 晚上打算睡觉的时候,群里反馈订单接收失败,开工排查问题,日志显示验签失败,发现一个蛮有意思的BUG,总算有了一个写作的素材 场景描述 本次的场景属于比较常见的收单API,对第三方的订单进行签名 ...

  8. 小白之Python基础(四)

    条件判断和循环: 1.条件判断类型: 1)if语句:(注意:if中的条件如果是:非零数值.非空字符串.非空list等,就判断为True,否则为False.) 2)if-else语句: 3)if-eli ...

  9. React报错之Objects are not valid as a React child

    正文从这开始~ 总览 当我们尝试在JSX代码中,直接渲染对象或者数组时,会产生"Objects are not valid as a React child"错误.为了解决该错误, ...

  10. EPLAN中的edz文件的用法

    1    EDZ 文件的定义 EDZ 是 EPLAN Data Archive Zipped(EPLAN 数据压缩文件包)的缩写,最早是专门为西门子定制的,现在已经 成为 EPLAN 中一种标准的部件 ...