zoukankan      html  css  js  c++  java
  • Spring @Conditional注解 详细讲解及示例

    前言:

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。

    @Conditional的定义:

    从代码中可以看到,需要传入一个Class数组,并且需要继承Condition接口:

    Condition是个接口,需要实现matches方法,返回true则注入bean,false则不注入。

    示例:

    首先,创建Person类:

    创建BeanConfig类,用于配置两个Person实例并注入,一个是比尔盖茨,一个是林纳斯。

    接着写一个测试类进行验证这两个Bean是否注入成功。

     运行,输出结果是这样的,两个Person实例被注入进容器。

    这是一个简单的例子,现在问题来了,如果我想根据当前操作系统来注入Person实例,windows下注入bill,linux下注入linus,怎么实现呢?

    这就需要我们用到@Conditional注解了,前言中提到,需要实现Condition接口,并重写方法来自定义match规则。

    首先,创建一个WindowsCondition类:

    matches方法的两个参数的意思在注释中讲述了,值得一提的是,conditionContext提供了多种方法,方便获取各种信息,也是SpringBoot中 @ConditonalOnXX注解多样扩展的基础。

    接着,创建LinuxCondition类:

    接着就是使用这两个类了,因为此注解可以标注在方法上和类上,所以分开测试:

    标注在方法上:

    修改BeanConfig:

    修改测试方法,使其可以打印当前系统名:

     

    运行结果如下:

    我是运行在windows上的所以只注入了bill,嗯,没毛病。

    接着实验linux下的情况,不能运行在linux下,但可以修改运行时参数:

    修改后启动测试方法:

     一个方法只能注入一个bean实例,所以@Conditional标注在方法上只能控制一个bean实例是否注入。

    标注在类上:

    一个类中可以注入很多实例,@Conditional标注在类上就决定了一批bean是否注入。

    我们试一下,将BeanConfig改写,这时,如果WindowsCondition返回true,则两个Person实例将被注入(注意:上一个测试将os.name改为linux,这是我将把这个参数去掉):

    结果两个实例都被注入: 

    如果将类上的WindowsCondition.class改为LinuxCondition.class,结果应该可以猜到:

    结果就是空的,类中所有bean都没有注入。

    多个条件类:

    前言中说,@Conditional注解传入的是一个Class数组,存在多种条件类的情况。

    这种情况貌似判断难度加深了,测试一波,新增新的条件类,实现的matches返回false(这种写死返回false的方法纯属测试用,没有实际意义O(∩_∩)O)

     BeanConfig修改一下:

    结果:

    现在如果将ObstinateCondition的matches方法返回值改成true,两个bean就被注入进容器:

    结论得:

    第一个条件类实现的方法返回true,第二个返回false,则结果false,不注入进容器。

    第一个条件类实现的方法返回true,第二个返回true,则结果true,注入进容器中。

  • 相关阅读:
    ext导出表格数据到excel中
    Oracle 外连接和 (+)号的用法
    通过json取树
    最简单的extjs 树
    extjs放在本地tomcat中部署运行
    extjs viewport panel tabPanel tree
    jsp注意的问题(初学)
    查看进程的路径,不用第三方软件
    vc常用技巧
    表单中单选按钮的有效性控制问题
  • 原文地址:https://www.cnblogs.com/tiancai/p/15224049.html
Copyright © 2011-2022 走看看