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

springboot自动配置原理以及手动实现配置类1、原理spring有一个思想是“约定大于配置” 。
配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot在启动的时候可以把一些配置类自动注入到spring的IOC容器里,项目运行之后就可以直接使用这些配置类的属性和方法等 。
springboot有一个全局配置文件 , application.properties / application.yml,各种属性都可以在文件中进行自定义配置 。
自动配置实现原理:
我们都知道项目的入口是 @SpringBootApplication 注解,这个注解标识了该类是springboot的启动类,那我们就从它入手一探究竟 。

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

文章插图
我们可以看到这个注解是一个复合注解,其中的 @EnableAutoConfiguration 注解表示开启自动配置,这个注解也是复合注解 。
我们可以看到它导入了一个名为AutoConfigurationImportSelector的类,那么这个类的作用是什么呢?
springboot自动配置原理以及手动实现配置类

文章插图
我们继续往下看,可以看到 selectImports( ) 方法
springboot自动配置原理以及手动实现配置类

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

文章插图

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

文章插图
每个配置类都有一些属性,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完成对自动配置类全路径配置
springboot自动配置原理以及手动实现配置类

文章插图
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ycw.autoconfig.configuration.SeviceAutoConfiguration2.4、在全局配置文件application.properties中添加属性注入
springboot自动配置原理以及手动实现配置类

文章插图
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 */@RestControllerpublic class ControllerTest { @Resource private ServiceProperties serviceProperties; @RequestMapping("test") public void test(){serviceProperties.print(); }}运行之后我们可以看到:
springboot自动配置原理以及手动实现配置类

推荐阅读