spring学习--13 condition

采用@Conditional和接口Condition实现基于条件的Bean的创建,可代替active的profile。一般用于多态下的Bean的创建。示例如下。

1. 通过接口Condition定义条件

window操作系统条件

package com.condition;

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

public class WindowsCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        return context.getEnvironment().getProperty("os.name").contains("Windows");
    }

}

MAC OS X 操作系统条件

package com.condition;

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

public class MacCondition implements Condition {

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

}

2. 定义用于多态的接口,并实现接口

接口:list命令在不同操作系统中的书写形式

package com.condition;

public interface ListService {
    public String showListCommand();
}

windows操作系统中list命令的书写形式

package com.condition;

public class WindowsListService implements ListService{
    @Override
    public String showListCommand() {
        return "dir";
    }
}

Mac Os X中list命令的书写形式

package com.condition;

public class MacListService implements ListService {
    @Override
    public String showListCommand() {
        return "ls";
    }
}

3. 配置类中使用@Conditional选择实例化

package com.condition;

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

@Configuration
@ComponentScan("com.condition")
public class ConditionConfig {
    @Bean
    @Conditional(WindowsCondition.class)
    public ListService windowsListService() {
        return new WindowsListService();
    }

    @Bean 
    @Conditional(MacCondition.class)
    public ListService  macListService() {
        return new MacListService();
    }
}

4. 测试类

此例用了多态根据条件实例化相关类

package com.condition;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConditionConfig.class)
public class Test {
    @Autowired 
    ListService listService;

    @org.junit.Test
    public void test() {
        System.out.println(listService.showListCommand());
    }
}

猜你喜欢

转载自blog.csdn.net/xiewz1112/article/details/80500133
今日推荐