根据条件注解 @Conditional 在不同条件下创建不同的 bean.
判断条件定义:
package com.pangu.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* linux
* @author etfox
*
*/
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
System.out.println(context.getEnvironment().getProperty("os.name"));
return context.getEnvironment().getProperty("os.name").contains("Linux") ||
context.getEnvironment().getProperty("os.name").contains("Mac OS X");
}
}
package com.pangu.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Windows
* @author etfox
*
*/
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Windows");
}
}
接口:
package com.pangu.conditional;
public interface ListService {
public String showListCmd();
}
实现类:
package com.pangu.conditional;
public class LinuxListService implements ListService {
@Override
public String showListCmd() {
return "ls";
}
}
package com.pangu.conditional;
public class WindowsListService implements ListService {
@Override
public String showListCmd() {
return "dir";
}
}
配置类:
package com.pangu.conditional;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConditionConfig {
@Bean
@Conditional(WindowsCondition.class)
public ListService windowsListService() {
return new WindowsListService();
}
@Bean
@Conditional(LinuxCondition.class)
public ListService linuxListService() {
return new LinuxListService();
}
}
执行类:
package com.pangu.conditional;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
@Test
public void test() {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(ConditionConfig.class);
ListService listService = context.getBean(ListService.class);
System.out.println(context.getEnvironment().getProperty("os.name")+"系统下的命令为"+
listService.showListCmd());
context.close();
}
}
结果:
九月 28, 2018 10:42:17 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@75828a0f: startup date [Fri Sep 28 22:42:17 CST 2018]; root of context hierarchy
Mac OS X
Mac OS X系统下的命令为ls
九月 28, 2018 10:42:18 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@75828a0f: startup date [Fri Sep 28 22:42:17 CST 2018]; root of context hierarchy