Enable原理实现
首先我们要明白Import的使用,因为Enable*封装了Import
@Import四种使用方式
导入类:
@Import(xxx.class)
会将导入的类加载到IOC容器中
导入配置类
@Import(xxxConfig.xxx)
会将配置类中的所有符合条件的bean导入到配置类中
通过实现ImportSelector接口
第一步:
public class MyEnableSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//返回要加载的类的全类名
return new String[]{"com.songjiayu.bean.User"};
}
@Override
public Predicate<String> getExclusionFilter() {
return null;
}
}
第二步
@Import(MyEnableSelector.class)
通过实现ImportBeanDefinitionRegistrar接口
第一步
public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 获得AbstractBeanDefinition对象
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
// 将user填入到ioc容器中
registry.registerBeanDefinition("user",beanDefinition);
}
}
第二步:
@Import(MyImportBeanDefinitionRegister.class)
Enable原理
上面说到Enable底层就是通过Import来实现的,可以这么说他就是调用了Import
那我们直接上代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(UserConfig.class) //导入配置类
public @interface EnableUser {
}
说明:当我们去调用EnableUser的时候,其实就是间接调用了@Import(UserConfig.class)