深入spring注解@Conditional

@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中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值