@Conditional:根据条件,注入bean的实例,标注在类上,表示对配置类所有成员生效
我们先看@Conditional注解的定义,这里的value,需要传入Condition的接口的实现
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
/**
* All {@link Condition}s that must {@linkplain Condition#matches match}
* in order for the component to be registered.
*/
Class<? extends Condition>[] value();
}
创建一个MyCondition 实现Condition接口
public class MyCondition implements Condition {
/**
* ConditionContext:判断条件能使用的上下文(环境)
* AnnotatedTypeMetadata:注释信息
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 1、能获取到ioc使用的beanfactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
// 2、获取类加载器
ClassLoader classLoader = context.getClassLoader();
// 3、获取当前环境信息
Environment environment = context.getEnvironment();
// 取到运行环境的信息
String property = environment.getProperty("os.name");
// 4、获取到bean定义的注册类,可以查看类的定义信息,如是否单例,是否懒加载等,详细查看BeanDefinitionRegistry的接口定义
BeanDefinitionRegistry registry = context.getRegistry();
// 可以判断容器中的bean注册情况,也可以给容器中注册bean
boolean definition = registry.containsBeanDefinition("red");
// 根据实际的情况,判断接口,返回boolean值,就可以了
return true;
}
}
使用,直接上代码
@Conditional({ MyCondition.class })
@Configuration
public class MyConfig {
@Bean
@Conditional({ MyCondition.class })
public Date date() {
return new Date();
}
}
可以标注在类上,也可以标注在实际的方法上,如果标注在类型,只有类上的,判断true,才会继续实例化标注了@Bean的方法