@Conditional基于条件判断是否注入bean,在springboot中有大量的自定义条件注解,ConditionalOnBean,ConditionalOnClass,ConditionalOnCloudPlatform等等。
下面我们就自己定义一个类似的注解,并看看他是怎么工作的吧。
1.定义一个注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Conditional(MyCondition.class)
public @interface ConditionMy {
boolean isOpen() default false;
}
2.定义一个自定义注解处理类
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(ConditionMy.class.getName());
boolean isOpen = (boolean) annotationAttributes.get("isOpen");
return isOpen;
}
}
3.应用一下
@Configuration
@ConditionMy(isOpen = true)
public class TestCondition {
@Override
public String toString() {
return "TestCondition{}";
}
}
4.运行一下
@SpringBootApplication
public class Demo3Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Demo3Application.class, args);
TestCondition bean = context.getBean(TestCondition.class);
System.out.println(bean);
}
}
5.运行结果展示,当isopen=true时,
2019-06-10 21:42:12.942 INFO 5164 --- [ restartedMain] com.example.demo3.Demo3Application : Started Demo3Application in 2.055 seconds (JVM running for 6.476)
TestCondition{}
从日志中可以看出TestCondition类成功导入了。
当isOpen=false时,
2019-06-10 21:43:37.161 INFO 7172 --- [ restartedMain] com.example.demo3.Demo3Application : Started Demo3Application in 1.55 seconds (JVM running for 2.34)
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo3.TestCondition' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:345)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)
at com.example.demo3.Demo3Application.main(Demo3Application.java:12)
... 5 more
无法获取指定的bean。
7.总结
最重要一步就是使用@Conditional(MyCondition.class)指定自己定义的条件的处理类,他的matches方法返回true时,这个bean会被注入到spring中。