第3章—高级装配—条件化的Bean

条件化的Bean

通过活动的profile,我们可以获得不同的Bean。Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解。

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

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

一、判断条件定义

1、判定Windows的条件

package com.home.Cont;

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

//编写Windows的判断类
public class WindowsCondition implements Condition {

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

}

2、判定Linux的条件

package com.home.Cont;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

//编写Linux的判断类
public class LinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("os.name").contains("Linux");
    }
}

二、不同系统下的Bean

1、接口

package com.home.Cont;

//不同系统命令的接口
public interface ListService {
    public String showListCmd();
}

2、Windows下所要创建的Bean

package com.home.Cont;
//window下的命令
public class WindowsListService implements ListService {
    @Override
    public String showListCmd() {
        return "dir";
    }

}

3、Linux下所要创建的Bean

package com.home.Cont;
//Linux下的命令
public class LinuxListService implements ListService {
    @Override
    public String showListCmd() {
        return "ls";
    }
}

三、配置类

package com.home.Cont;

import org.springframework.context.annotation.*;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@ComponentScan(basePackages="com.home.Cont")
public class ConditionConfig {

    @Bean
    @Conditional(LinuxCondition.class)// 使用@Conditional注解,符合Linux条件就实例化LinuxListService
    public ListService linuxListService() {
        return new LinuxListService();
    }

    @Bean
    @Conditional(WindowsCondition.class)// 使用@Conditional注解,符合Windows条件就实例化WindowsListService
    public ListService windowsListService() {
        return new WindowsListService();
    }
}

四、测试类

package com.home.Cont;

import org.junit.After;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringConditionalTest {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);

    @Test
    public void contextTest() {
        ListService listService = context.getBean(ListService.class);

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

    @After
    public void closeContext() {
        context.close();
    }

}

最后的运行结果为:

image

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

Spring 5.0中文版-3.9

3509
来自专栏程序猿DD

Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析

在Spring Boot 2.0中推出了Relaxed Binding 2.0,对原有的属性绑定功能做了非常多的改进以帮助我们更容易的在Spring应用中加载和...

3964
来自专栏微信公众号:Java团长

Spring Boot属性配置和使用

Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置。

1301
来自专栏Java 技术分享

SpringMVC(一)

1993
来自专栏Java成神之路

SpringMVC学习笔记

(1)通过 contextConfigLocation 来配置 SpringMVC 的配置文件

1084
来自专栏Albert陈凯

2018-04-27 读配置文件到静态变量中,加载properties到static变量field

项目的配置文件要写到jar档外面,提供给运维人员更改,基于这个需求,就会有很多的常量需要从外部文件读取进来 JAVA最常见的就是properties文件,提供k...

3659
来自专栏Kirito的技术分享

解析Spring中的ResponseBody和RequestBody

spring,restful,前后端分离这些关键词都是大家耳熟能详的关键词了,一般spring常常需要与前端、第三方使用JSON,XML等形式进行交互,你也一定...

3.7K17
来自专栏码字搬砖

基于slf4j实现多线程日志

对于多线程的程序来说,排错是一件特别麻烦的事情,特别是针对日志,多线程有可能发生日志写阻塞,那我们有没有可能每一个线程一个日志文件呢?答案是可以的,基于slf4...

2484
来自专栏微服务生态

Flume-NG源码分析-整体结构及配置载入分析

终于开始Flume源码的分析研究工作了,我也是边学边和大家分享,内容上难免有不足之处,望大家见谅。

1454
来自专栏Java Web

Spring(3)——装配 Spring Bean 详解

装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中...

5014

扫码关注云+社区

领取腾讯云代金券