通常企业级的Spring应用会提供几套部署环境,用于各阶段的功能检验:
- dev 开发环境
- test 测试环境
- pre 预发环境
- prod 生产环境
对于同一个应用在不同环境里依赖的资源,比如MySQL、Redis、MQ等等基础资源,可能会存在差异性,要解决此问题,大致手段有两种:
- 编译时差异化 , 一般性需要外部工具,例如Maven Profile构建;
- 运行时配置化,一般通过环境变量、Java系统属性;
条件装配
Spring 3.1 之后,Spring 提供了 和注解 @Profile , Spring允许设置两种类型:
- 有效 Active Profile
- 默认 Default Profile
当有效Profile不存在时,采用默认Profile,而Spring应用有两种方式Spring Profile配置方式:
- ConfigurableProfiles: setActiveProfiles & addActiveProfile & setDefaultProfiles
- java系统属性: spring.profiles.active & spring.profiles.defualt
自定义条件装配
public interface CalculatingService {
/**
* 累加求和
*
* @param values
* @return
*/
Integer sum(Integer... values);
}
// 定义profile java8
@Service
@Profile("java8")
public class LambdaCalculatingService implements CalculatingService {
@Override
public Integer sum(Integer... values) {
int sum = Stream.of(values).reduce(0, Integer::sum);
System.out.printf("Java 8 Lambda实现:%s 累加结果:%d\n", Arrays.toString(values), sum);
return sum;
}
}
// 定义profile java7
@Service
@Profile("java7")
public class IterationCalculatingService implements CalculatingService {
@Override
public Integer sum(Integer... values) {
int sum = 0;
for (Integer value : values) {
sum += value;
}
System.out.printf("Java 8 Lambda实现:%s 累加结果:%d\n", Arrays.toString(values), sum);
return null;
}
}
@Configuration
@ComponentScan(basePackageClasses = CalculatingService.class)
public class CalculatingServiceApplication {
static {
System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME,"java8");
System.setProperty(AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME,"java7");
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(CalculatingServiceApplication.class);
context.refresh();
CalculatingService calculatingService = context.getBean(CalculatingService.class);
calculatingService.sum(1,2,3,4,5,6,7,8,9);
context.close();
}
}