使用注解@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等。

标签: Java, Spring, spring-boot

添加新评论