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

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

条件化的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();
    }

}

最后的运行结果为:

img_5cd66325f949601c47576fcc71239d5e.png
image
相关文章
|
4月前
|
Java Spring 容器
Spring注解开发定义bean及纯注解开发模式
Spring注解开发定义bean及纯注解开发模式
35 0
|
Java 微服务 Spring
@EnableDiscoveryClient注解的作用
@EnableDiscoveryClient注解的作用 @EnableDiscoveryClient 及@EnableEurekaClient 类似,都是将一个微服务注册到Eureka Server(或其他 服务发现组件,例如Zookeeper、Consul等)
|
2月前
|
Java API Spring
|
8月前
|
SQL Java 数据库连接
深入解析@MapperScan注解:简化MyBatis接口与映射器的关联
在Java持久化领域,MyBatis是一个广泛使用的ORM(对象关系映射)框架,用于将数据库中的数据映射到Java对象中。MyBatis的核心概念是SQL映射器(Mapper),它定义了数据库操作的方法。为了简化Mapper接口与映射器的关联,MyBatis提供了`@MapperScan`注解。本文将深入探讨`@MapperScan`注解的作用、用法,以及在MyBatis应用中的应用场景。
692 0
|
9月前
|
Java
java注解(作用于注解)
java注解(作用于注解)
84 0
|
9月前
|
自然语言处理 SpringCloudAlibaba Java
Spring条件装配注解:@Conditional及其衍生扩展注解
**条件装配**是`Spring Boot`一大特点,根据是否满足指定的条件来决定是否装配 Bean ,做到了动态灵活性,starter的自动配置类中就是使用@Conditional及其衍生扩展注解@ConditionalOnXXX做到了自动装配的
78 0
|
Java Spring 容器
《SpringBoot系列十二》:如何自定义条件装配(由@ConditionalOnClass推导)
《SpringBoot系列十二》:如何自定义条件装配(由@ConditionalOnClass推导)
283 0
《SpringBoot系列十二》:如何自定义条件装配(由@ConditionalOnClass推导)
|
Java Linux Windows
Spring注解(四):@Conditional根据条件注册组件
在进行spring注解开发时,如果对于某个bean生成了多个实例,在进行组件注册的时候会全部注入到IOC的容器当中,比如:
135 0
Spring注解(四):@Conditional根据条件注册组件
|
Java 数据库连接
Hibernate注解-类级别注解
Hibernate注解-类级别注解
73 0