springboot-自动配置原理
Condition
Condition是spring4增加的条件判断功能,通过这个功能可以实现选择性的创建bean操作
使用
在要创建bean的地方(@Bean、@Configuration,@Component和其子注解)使用注解@Conditional
,注解的参数为实现了Condition
接口的类,当实现的方法返回true时则进行创建
自定义子注解
-
创建子注解
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional(ClassCondition.class) public @interface MyOnClass { String[] value(); }
-
实现判断逻辑
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; } }
-
使用
@Bean @MyOnClass("redis.clients.jedis.Jedis") public User user(){ return new User(); }
spring官方实现的大量的子condition
@Enable*注解
springboot中提供了很多enable开头的注解,这些注解都是用于动态启动某些功能的。而其底层原理是使用@Import注解导入一些配置类,实现Bean的动态加载
这类注解就是对@Import
进行的一次封装
@Import
使用@Import导入的类会被spring加载到ioc容器中
用法:
- 直接导入bean
- 导入配置类
- 导入ImportSelector实现类,一般用于加载配置文件中的类
- 导入ImportBeanDefinitionRegistrar实现类
@EnableAutoConfiguration
- @EnableAutoConfiguration注解内部使用@Import(AutoConfigurationImportSelector.class)来加载配置类
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当springboot应用启动时,会自动加载这些配置初始化bean
- 并不是所有bean都被被初始化,在配置类中使用Condition来加载满足条件的bean