实现:
一、自定义Starter
最简实现
1、classpath(springboot下是resources)路径下创建MATA-INF/spring.factories文件,写入需要加载的
配置类全路径,仿照别人的spring.factories写即可
2、实现配置类,提供一个bean
3、做到这里starter就已经定义好了,其余的都是完善功能
提供用户配置属性功能
1、实现一个属性配置类,用@ConfigurationProerties获取属性
2、在配置类上用@EnableConfigurationProerties加载属性配置类,给属性赋值
提供不加载bean的功能,条件自定义
1、实现一个Condition接口实现类,实现自己的条件判断
2、实现一个@ConditionOnMissingBean注解类,让他继承@Conditional注解
3、使用自己定义的注解
spring.factories写法:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.lzb.redis.configure.RedisConfiguration,\
com.lzb.redis.configure.DubboConfiguration,\
com.lzb.redis.configure.ZookeeperConfiguration
二、自动配置流程
自动配置流程
1、springboot通过@EnableAutoConfiguration注解,加载ImportSelector接口的实现类AutoConfigurationImportSelector,
通过这个类来自动扫描META-INF/spring.factories文件,加载配置类
2、加载的Configuration配置类通过@bean的方式提供bean。
3、通过@EnableConfigurationProperties来加载属性配置类,属性配置类通过@ConfigurationProperties
来加载配置文件中的配置信息,完成配置信息的动态注入。
4、再通过@Conditional条件注解来判断这个类是否被加载。使用这个注解需要提供一个Condition
接口的实现类,通过matches()方法来确定是否加载。
三、自动配置注解
Condition接口
使用Condition接口判断就是springboot控制依赖创建bean的基本原理。
@Conditional
通过Condition接口的matches()方法来判断这个bean是否加载
@Enable
底层使用Import注解导入一些配置类,实现bean加载,@EnableTransactionManagement
@Import
1、导入bean
2、导入配置类,配置类可不写配置注解
3、导入ImportSelector实现类,通过String类型的类路径加载bean,可以实现配置类加载bean
4、导入ImportBeanDefinitionRegistrar实现类,注册bean再使用
@EnableAutoConfiguration
启动类注解,注解内部使用@Import(AutoConfigurationImportSelector.class)来加载配置类
配置类文件位置:META-INF/spring.factories,自动加载这些配置类,使用Condition来加载满
足的bean。
@EnableConfigurationProperties
这个注解是导入一个EnableConfigurationPropertiesRegistrar类,通过这个类来加载属性配置类,
使@ConfigurationProperties 注解的类生效。
@ConfigurationProperties
加载配置文件中的属性,为属性赋值。
四、@Conditional底层原理
@Conditional底层原理详解,可以自己对照翻看源码
首先定位到ConfigurationClassBeanDefinitionReader类的loadBeanDefinitionsForConfigurationClass()方法,
这个方法的作用就是移除已经加载的bean。此方法通过内部类TrackedConditionEvaluator的
shouldSkip(configClass)方法返回值来移除已经加载的bean。
内部类TrackedConditionEvaluator的shouldSkip(configClass)方法是在做排除配置类的工作,排除完
它将数据传递给conditionEvaluator类的shouldSkip()方法。
ConditionEvaluator类shouldSkip()方法就是执行@Conditional的核心方法。
它先判断bean是否有@Conditional注解,再获取@Conditional注解的value属性,得到一个
Condition[]接口数组并且排序,最后遍历执行数组对象的matches()方法,当所有对象的
matches()方法都返回true时,就不会移除这个bean的加载,它是通过返回布尔值来将结果
TrackedConditionEvaluator类的返回给shouldSkip()方法。
标签:SpringBoot13,自定义,配置,bean,Conditional,Condition,注解,Starter,加载
From: https://www.cnblogs.com/chen-zhou1027/p/16907045.html