Spring还开放出了若干种可编程控制的bean的初始化方式,通过分支语句由固定的加载bean转成了可以选择bean是否加载或者选择加载哪一种bean
编程式控制企业级开发中不可能在Spring容器中进行bean的饱和式加载(不管用不用全部加载),而是采取必要性加载(用什么加载什么即用什么技术就加载对应的Bean)
类的全路径名判断是否加载了某个类)public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
try {
Class> clazz = Class.forName("com.itheima.bean.Mouse");
if(clazz != null) {
return new String[]{"com.itheima.bean.Cat"};
}
} catch (ClassNotFoundException e) {
// e.printStackTrace();
return new String[0];
}
return null;
}
}
注解式控制spring-boot-starter定义了若干种控制Bean加载的条件注解,这些条件注解还可以做并且的逻辑关系,写多个就是多个条件都成立
| 条件注解 | 描述 |
|---|---|
@ConditionalOnClass注解的name属性指定类的全类名,这个类可能不存在 | 当虚拟机中加载了某个类时才加载对应的Bean |
@ConditionalOnMissingClass注解的value属性指定类的全类名,这个类可能不存在 | 当虚拟机中没有加载指定的类时才加载对应的Bean |
@ConditionalOnBean注解的name属性指定容器中的bean名称 | 当容器中加载了指定名称的Bean时才加载对应的Bean |
@ConditionalOnWebApplication注解 | 当容器环境是web环境时才加载对应的Bean |
@ConditionalOnNotWebApplication注解 | 当容器环境不是web环境时才加载对应阿Bean |
public class SpringConfig {
@Bean
// 当容器中加载了mysql驱动时才加载dataSource对象
@ConditionalOnClass(name="com.mysql.jdbc.Driver")
public DruidDataSource dataSource(){
return new DruidDataSource();
}
}
@Component("tom")
// 当虚拟机中没有加载Dog类但加载了Mouse类时并且Bean的名称为jerry才加载对应的Cat
@ConditionalOnMissingClass("com.itheima.bean.Dog")
@ConditionalOnClass(name = "com.itheima.bean.Mouse")
@ConditionalOnBean(name="jerry")
public class Cat{
}