Condition实现选择性创建Bean的操作
@Conditional()括号为.class文件 返回值为布尔类型 ,true则生成对应Bean 否则不生成
例: 当只有导入某坐标时 才加载某Bean
class文件需要继承Condition,重写matches方法 通过Class<?> cls=Class.forName("包名"); 用try catch包着在catch中做返回值处理
在配置文件中用@Configuration注解 class文件,@Bean注解需要生成的Bean
@Configuration
public class UserConfig(){
@Bean
@Conditional(ClassCondition.class)
//括号内放class文件 返回值为布尔类型 true才会创建user的Bean
public User user(){
return new User();
}
}
//class文件
public class ClassCondition implements Condition{
@Override
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
bool flag=true;
try{
Class<?> cls=Class.forName("");//包名 想要导入的
}catch(ClassNotFoundException e){
flag=false;
}
return flag;
}
}
例:类判断定义为动态,动态指定哪个文件存在
定义一个新的注解文件 Annotation的class文件 ConditionOnClass
//注解文件
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//上面三个注解为Conditional注解文件中自带3个注解 要一并复制过来
@Conditional(ClassCondition.class)//这样子新注解功能与原注解功能就一致
public @interface ConditionOnClass{
String[] value();//定义属性
}
//控制Bean生成文件
@Configuration
public class UserConfig(){
@Bean
//@Conditional()//括号内放class文件 返回值为布尔类型 true才会创建user的Bean
@ConditionOnClass("")//使用同上
public User user(){
return new User();
}
}
//class文件
public class ClassCondition implements Condition{
@Override
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
//context 上下文对象 用于获取环境,IOC容器,Classloader对象
//metadata 注解原对象 用于获取注解的属性
Map<String,Object> map= metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
bool flag=true;
try{
for (String className:value) {
Class<?> cls=Class.forName(className);
}
}catch(ClassNotFoundException e){
flag=false;
}
return flag;
}
}
总结
1.自定义条件:自定义类实现Condition接口,重写matches方法,在方法中逻辑判断返回boolean值
2.SpringBoot常用条件注解
@ConditionalOnProperty;判断配置文件是否有对应属性 值
@ConditionalOnClass;判断环境中是否有对应字节码文件
@ConditionalOnMissingBean;判断没有对应Bean