spring-boot使用profile来控制对象加载
使用注解@Profile来标识加载的对象,配合@Component注解一起使用。
同@Component类似的注解也可以一起使用,比如@Service、@Controller、@Repository、@Configuration。
如下,我们有两个HelloService的实现,一个是用于开发环境的,这个实现可以简单一点;另外一个是用于真正的生产环境的,要进行真正的处理,比如调用RPC,数据库处理等。
@Service
@Profile({"dev"})
public class HelloServiceDevImpl implements HelloService {
// ...
}
@Service
@Profile({"pro"})
public class HelloServiceImpl implements HelloService {
// ...
}
application.yml的配置,如果要使用HelloServiceDevImpl,要激活对应的profile,可以使用:
spring:
profiles:
active: dev
类似的正式环境的配置,可以使用:
spring:
profiles:
active: pro
如果对象依赖于多个profile,也可以传入多个:
@Service
@Profile({"pro", "A", "B"})
public class HelloServiceImpl implements HelloService {
// ...
}
这样只有当pro、A、B者三个profile都激活的时候才会启用:
spring:
profiles:
active: pro,A,B
扩展开来,控制对象的加载的注解父类为@Conditional,使用该注解的话要自己编写一个类实现org.springframework.context.annotation.Condition来进行处理。
spring-boot提供了多个已经实现好的注解可以用,@Profile只是其中一个,其他类似的还有@ConditionalOnBean,@ConditionalOnClass,@ConditionalOnExpression,@ConditionalOnJava,@ConditionalOnProperty等。