SpringBoot13(springboot自定义Starter)

实现:

一、自定义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()方法。

posted on 2022-11-19 20:57  陈嘻嘻-  阅读(45)  评论(0编辑  收藏  举报

导航