springboot-自动配置原理

springboot-自动配置原理

起男 1,010 2021-08-31

springboot-自动配置原理

Condition

Condition是spring4增加的条件判断功能,通过这个功能可以实现选择性的创建bean操作

使用

在要创建bean的地方(@Bean、@Configuration,@Component和其子注解)使用注解@Conditional,注解的参数为实现了Condition接口的类,当实现的方法返回true时则进行创建

自定义子注解

  1. 创建子注解

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Conditional(ClassCondition.class) 
    public @interface MyOnClass {
        String[] value();
    }
    
  2. 实现判断逻辑

    public class ClassCondition implements Condition {
    
        /**
         *
         * @param context 上下文对象
         * @param metadata 注解的元对象,获取注解定义的属性值
         * @return
         */
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            boolean flag = true;
            Map<String, Object> attributes = metadata.getAnnotationAttributes(MyOnClass.class.getName());
            System.out.println(attributes);
            String[] values = (String[]) attributes.get("value");
            try {
                for (String value : values){
                    Class<?> cls = Class.forName(value);
                }
            }catch (Exception e){
                flag = false;
            }
            return flag;
        }
    }
    
  3. 使用

        @Bean
        @MyOnClass("redis.clients.jedis.Jedis")
        public User user(){
            return new User();
        }
    

spring官方实现的大量的子condition

@Enable*注解

springboot中提供了很多enable开头的注解,这些注解都是用于动态启动某些功能的。而其底层原理是使用@Import注解导入一些配置类,实现Bean的动态加载

这类注解就是对@Import进行的一次封装

@Import

使用@Import导入的类会被spring加载到ioc容器中

用法:

  1. 直接导入bean
  2. 导入配置类
  3. 导入ImportSelector实现类,一般用于加载配置文件中的类
  4. 导入ImportBeanDefinitionRegistrar实现类

@EnableAutoConfiguration

  1. @EnableAutoConfiguration注解内部使用@Import(AutoConfigurationImportSelector.class)来加载配置类
  2. 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当springboot应用启动时,会自动加载这些配置初始化bean
  3. 并不是所有bean都被被初始化,在配置类中使用Condition来加载满足条件的bean