一、Condition
通过实现Condition接口去完成有条件的加载相应的Bean
二、Enable注解原理
SpringBoot不能直接获取在其他工程中定义的Bean
原因:@ComponentScan默认扫描范围:当前引导类所在包及其子包
有三种解决方案:
1.使用@ComponentScan扫描需要注入的包
2.可以使用@Import注解,加载类。这些类都会被Spring创建,并放入IOC容器
3.可以对Import注解进行封装,形成Enable注解。
@Enable* 底层依赖于@Import注解导入一些类。
@Import4种用法:
(1)导入Bean——@Import(User.class)
(2)导入配置类——@Import(UserConfig.class)
(3)导入 ImportSelector 实现类 @Import(MyImportSelector.class)
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.itheima.domain.User", "com.itheima.domain.Role"};
}
}
(4)导入 ImportBeanDefinitionRegistrar 实现@Import({MyImportBeanDefinitionRegistrar.class})
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
AbstractBeanDefinition beanDefinition =
BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
registry.registerBeanDefinition("user", beanDefinition);
}
}
三、自动配置原理
自动配置的注解是@EnableAutoConfiguration
,是通过
ImportSelector的一个实现类AutoConfigurationImportSelector,作用就是收集需要导入的配置类,获取注入类的方法是 selectImports(),它实际调用的是getAutoConfigurationEntry,去获取所有需要自动装配的配置类的路径(从META-INF/spring.factories 获取自动配置类的路径),在配置类里面使用@Conditional来过滤不需要加载的Bean,从而实现需要的Bean的自动加载。
四、自定义starter
写一个starter工程模块,里面写上自定义的配置类,配置类里面去设置我们要加载哪些Bean,还是通过@Conditional去过滤,然后在需要使用的地方引入就行。