使用Spring的Profile注解进行bean切换
利用Spring的配置文件机制,动态切换被注入的Bean。
暂时建立一个适当的spring-boot项目。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hoge</groupId>
<artifactId>springbootexpr2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootexpr2</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
创建一个合适的接口,并创建几个实现类。
public interface ProfileSample {
String getValue();
}
@Component
@Profile("default")
public class DefaultProfile implements ProfileSample {
public String getValue() {
return "default";
}
}
在中国,可以这样表达:如果未指定个人配置文件(profile),则默认值为default。因此,如果在个人配置文件(profile)注释中指定了这个值,那么当未指定个人配置文件时会使用这个类。
@Component
@Profile("dev")
public class DevProfile implements ProfileSample {
public String getValue() {
return "dev";
}
}
@Component
@Profile("production")
public class ProductionProfile implements ProfileSample {
public String getValue() {
return "production";
}
}
在用于启动的类中进行接口的注入。
@Controller
@EnableAutoConfiguration
@ComponentScan
public class SampleController {
@Autowired
ProfileSample sample;
@RequestMapping("/")
@ResponseBody
String home() {
System.out.println(sample.getValue());
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}
}
只要在某处指定spring.profiles.active属性,如果未指定,则将使用默认default,就像上面提到的那样。
在命令行参数中指定配置文件的方式如下。
--spring.profiles.active=dev
如果在属性文件中(例如application.yaml)指定的话,可以像这样。
spring.profiles.active: production
顺便提一下,有很多种属性指定的方法,关于这些方法的列表和优先级,请参考 https://docs.spring.io/spring-boot/docs/2.0.0.M4/reference/htmlsingle/#boot-features-external-config
如果只是像这个例子那样的内容,使用接口的默认方法就足够了。