采用@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());
}
}