Spring4.x高级话题(四):条件注解@Conditional

4,573 阅读2分钟
原文链接: blog.longjiazuo.com

一. 点睛

Spring4.x常用配置(四):Spring Profile中知道,通过活动的profile可以获得不同的BeanSpring4提供了一个更加通用的基于条件的Bean的创建,即使用@Conditional注解。

@Conditional根据满足某一个特定条件创建一个特定的Bean。比如说,当某一个jar包在某一个类路径下的时候,自动配置一个或者多个Bean;或者只有某个Bean被创建才会创建另外一个Bean。总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动的配置。

Spring Boot中大量的应用到条件注解,后面有机会我们会说到。

下面的示例将以不同的操作系统为条件,将通过实现Condition接口,并重写其matches方法来构造判断条件。若在Windows系统下运行程序,则输出列表命令 为dir;若在Linux操作系统下运行程序,则输出列表命令为ls

二. 示例

1. 判断条件定义

1.1 判定Windows的条件

package org.light4j.sping4.senior.conditional;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class WindowsCondition implements Condition {

    public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("os.name").contains("Windows");
    }
}

1.2 判定Linux的条件

package org.light4j.sping4.senior.conditional;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class LinuxCondition implements Condition {

    public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("os.name").contains("Linux");
    }
}

2. 不同系统下的Bean类

2.1 接口

package org.light4j.sping4.senior.conditional;

public interface ListService {
    public String showListCmd();
}

2.2 Windows下所要创建的Bean类

package org.light4j.sping4.senior.conditional;

public class WindowsListService implements ListService {

    @Override
    public String showListCmd() {
        return "dir";
    }
}

2.3 Linux下所要创建的Bean类

package org.light4j.sping4.senior.conditional;

public class LinuxListService implements ListService{

    @Override
    public String showListCmd() {
        return "ls";
    }
}

3. 配置类

package org.light4j.sping4.senior.conditional;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConditionConifg {
    @Bean
    @Conditional(WindowsCondition.class) //①
    public ListService windowsListService() {
        return new WindowsListService();
    }

    @Bean
    @Conditional(LinuxCondition.class) //②
    public ListService linuxListService() {
        return new LinuxListService();
    }
}

代码解释:

① 通过@Conditional注解,符合Windows条件则实例化windowsListService
② 通过@Conditional注解,符合Linux条件则实例化linuxListService

4. 运行

package org.light4j.sping4.senior.conditional;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConifg.class);

        ListService listService = context.getBean(ListService.class);

        System.out.println(context.getEnvironment().getProperty("os.name") + "系统下的列表命令为: " + listService.showListCmd());

        context.close();
    }
}

我的系统是windows,运行结果如下图所示:
condition

5. 源代码示例:

github地址:点击查看
码云地址:点击查看

打赏 欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA