springboot 自动配置 autoConfig 全流程

2 篇文章 0 订阅
2 篇文章 0 订阅

目录

  • 1.自动配置简介
  • 2.实现方式
  • 3.springboot封装自定义starter

1.自动配置简介

springboot火了好几年,并以自身的简易特性,有着越来越广阔的使用市场;

核心: 提供缺省配置
spring实现原理: 封装了常见的第三方的工具,如mybatis,Rabbit,Elasticsearch等等,集成时,提供properties配置即可,相关的bean,由spring实现;
Spring根据一些生成条件 @ConditionXXX+ 配置信息(properties),决定是否自动配置这个组件;
eg:当我们提供了mybatis相关properties 并且 没有主动实现相关bean时,spring则根据相应的条件,实例化这些bean;即实现了自动配置;

2.实现方式

原理: 不仅仅是springboot,所有工具的自动配置,都是工具提供了默认实现;

通过简介,了解到:自动配置= @Conditional… + …Properties+其他;

2.1 从properties看起

spring官网提供了所有的自动配置属性,可参考:
https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/htmlsingle/
在这里插入图片描述
从直观上我们看到,每种module,默认都有特定的名称前缀;springboot会加载绑定这些前缀的属性到对应配置下的实体bean;

2.2 进入主流程

springboot启动类注解@SpringBootApplication里面,有@EnableAutoConfiguration,这里面导入了具体操作类:@AutoConfigurationImportSelector

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME)
@Documented @Inherited @AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class) public @interface
EnableAutoConfiguration {

2.3 调用方法链

AutoConfigurationImportSelector 其中的方法链:
selectImports==>
getAutoConfigurationEntry==>
getCandidateConfigurations==>
org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames ==>
loadSpringFactories

在loadSpringFactories方法中,会加载classpath路径下所有"META-INF/spring.factories"文件,不仅仅加载spring的,第三方和自定义的也会加载;这也为自定义starter提供了途径;

2.4 自动配置类

在这里插入图片描述

org.springframework.boot.autoconfigure.EnableAutoConfiguration对应一个列表,目前有100多个,他们有个共性,都是以xxxAutoConfiguration结尾,这就是各组件的自动配置,

2.5进入具体实现,以mybatis为例:

在这里插入图片描述
发现mybatis将自身的实现,也加入到了springboot的自动配置列表,org.springframework.boot.autoconfigure.EnableAutoConfiguration,这样算是交给spring管理了,按照2.3里的方法链,就实现了自动配置;

2.6进入MybatisAutoConfiguration

在这里插入图片描述
我们发现类上有@EnableConfigurationProperties(MybatisProperties.class)
和文中一些@Conditionalxxx注解

1. @EnableConfigurationProperties

该注解实现配置文件到JavaBean的映射,即将配置属性绑定到对应的实体bean上,即MybatisProperties里,这里前缀mybatis,这是默认的前缀,约束在这里插入图片描述

2.@Conditionalxxx

该注解实现目标类,或方法,在@Conditional条件成立时才会执行;
eg:
@ConditionalOnClass({ SqlSessionFactory.class,
SqlSessionFactoryBean.class }) 表示:类路径下有这个文件,才会执行

@ConditionalOnBean(DataSource.class),表示spring上下文有这个bean,才会执行

@ConditionalOnMissingBean
表示spring上下文,没有这个bean,才会执行

这也是习惯优于配置的最终落地,
eg:当我们自己实现sqlSessionFactory时,优先使用我们自己的,当我们自己没有实现时,spring就会默认实现;

其他的conditional比如:
在这里插入图片描述
总结:

自动配置是springboot启动时,通过@EnableAutoConfiguration加载路径下的所有的META-INF/spring.factories,加载列表里的自动配置类都以xxxAutoConfiguration结尾,这些类上有对应的各自的属性javaBean,格式一般都是xxxProperties,用注解@EnableConfigurationProperties实现绑定,之后根据一些@Conditional条件,决定是否自动配置,还是用开发者自定义的;

3.springboot封装自定义starter

一张太长,放下篇了:springboot封装自定义starter

首先,确保已经添加了 `redisson-spring-boot-starter` 依赖。 然后,在 Spring Boot 3.1 中,你可以使用 `@ConfigurationPropertiesScan` 来扫描自定义的配置类。因此,我们可以创建一个 `RedissonProperties` 配置类,并使用 `@ConfigurationProperties` 注解来指定属性前缀,如下所示: ```java @ConfigurationProperties(prefix = "redisson") public class RedissonProperties { private String address; private String password; // 其他属性... // getter 和 setter 方法... } ``` 接下来,我们可以创建一个配置类 `RedissonAutoConfiguration`,并使用 `@ConditionalOnClass` 注解来确保 Redisson 相关的类在类路径中存在。然后,我们可以使用 `@EnableConfigurationProperties` 注解来启用 `RedissonProperties` 配置属性,并使用 `@Bean` 注解来创建 `RedissonClient` 对象,如下所示: ```java @Configuration @ConditionalOnClass(Redisson.class) @EnableConfigurationProperties(RedissonProperties.class) public class RedissonAutoConfiguration { @Bean(destroyMethod = "shutdown") RedissonClient redissonClient(RedissonProperties redissonProperties) { Config config = new Config(); config.useSingleServer() .setAddress(redissonProperties.getAddress()) .setPassword(redissonProperties.getPassword()); // 其他配置... return Redisson.create(config); } } ``` 最后,我们需要在 `application.properties`(或 `application.yml`)文件中配置 Redisson 相关的属性,如下所示: ```properties redisson.address=redis://localhost:6379 redisson.password=password # 其他属性... ``` 现在,我们就可以通过 `@Autowired` 注解来注入 `RedissonClient` 对象,并使用 Redisson 来操作 Redis 了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值