Spring框架学习(七):@Conditional注解:SpringBoot的基石

如果你看了前6篇文章,我相信你对配置Spring、理解Spring的核心原理已经有了基本认知。本系列文章不是解读Spring源码,而是了解Spring这个框架如何简化了Java开发。我想你也会像我一样有这种感觉:Spring的注解太多了,这些注解怎么这么厉害?....其实支撑整个庞大的Spring框架背后是Java的基本知识:反射、设计模式等等。其实注解本身没有什么用,是程序在运行时赋予了它意义,没错,运行时,这些注解基本都是通过反射机制来获取到,然后根据这个注解去完成一个逻辑。

 

你一定对SpringBoot不陌生,“开箱即用、约定大于配置”的理念。实际上,SpringBoot整个框架底层还是Spring,简化开发的想法,应该是每个框架设计者都在考虑的事情,谁不想把框架设计得更简单呢?那你知道SpringBoot为什么能做到“开箱即用”吗?

 

Spring有一个强大的注解:@Conditional。从字面意思,你就应该知道,这是“条件”的意思。没错,这个注解能让bean的创建条件化,什么意思?就是根据条件是否满足来决定bean是否创建。当然了,光使用这个注解是没有作用的,还需要给这个注解指定参数。看一下@Conditional的源码。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
    Class<? extends Condition>[] value();
}

使用这个注解应该传一个Class对象作为参数,就像这个样子:@Conditional(MyCondition.class)这个MyCondition类是你实现了Condition接口的类,实现这个接口,对matches()方法重写,就能实现你的逻辑,这个函数返回值决定了@Conditional注解是否创建bean,就像这样:

    @Bean
    @Conditional(MyCondition.class)
    MyBean myBean(){
        new MyBean()
    }

条件如果满足,这个bean就创建,否则不创建。你可以亲自尝试一下,看看如何编写matches()方法。《Spring实战第四版》中是这么写的:

 

ConditionContext是matches()函数的一个参数。怎样?你是不是看到了SpringBoot的影子?

关于@Conditional注解就介绍到这里,欢迎评论、收藏、关注!下一篇文章我们探索一下Spring高级的装配方式。

 

posted @ 2019-07-22 10:29  陈玉林  阅读(234)  评论(0编辑  收藏  举报