使用@Profile注解进行多环境配置
Spring Boot除了支持使用Profile文件进行多环境配置外,还支持使用@Profile注解进行多环境配置。@Profile注解主要使用在类上,并需要通过value属性指定类对应的环境配置标识(等同于Profile文件名称中的profile值),然后同样需要在全局配置文件中进行指定激活。
下面,通过一个案例来演示@Profile注解进行多环境配置的具体使用,具体步骤如下。
(1)在chapter02项目的com.itheima.config包下,新创建一个用于数据库配置的接口DBConnector,并在该接口中声明一个数据库配置连接方法,内容如文件1所示。
文件1 DBConnector.java
1 public interface DBConnector {
2 public void configure();
3 }
(2)接着,在chapter02项目的com.itheima.config包下,针对数据库配置接口DBConnector进行不同数据库配置创建不同环境的实现类DevDBConnector、TestDBConnector和ProdDBConnector,并重写configure()方法模拟进行不同数据库环境的连接配置,内容分别如文件2、3和4所示。
文件2 DevDBConnector.java
1 import org.springframework.context.annotation.Configuration;
2 import org.springframework.context.annotation.Profile;
3 @Configuration
4 @Profile("dev") // 指定多环境配置类标识
5 public class DevDBConnector implements DBConnector {
6 @Override
7 public void configure() {
8 System.out.println("数据库配置环境dev");
9 }
10 }
文件3 TestDBConnector.java
1 import org.springframework.context.annotation.Configuration;
2 import org.springframework.context.annotation.Profile;
3 @Configuration
4 @Profile("test") // 指定多环境配置类标识
5 public class TestDBConnector implements DBConnector {
6 @Override
7 public void configure() {
8 System.out.println("数据库配置环境test");
9 }
10 }
文件4 ProdDBConnector.java
1 import org.springframework.context.annotation.Configuration;
2 import org.springframework.context.annotation.Profile;
3 @Configuration
4 @Profile("prod") // 指定多环境配置类标识
5 public class ProdDBConnector implements DBConnector {
6 @Override
7 public void configure() {
8 System.out.println("数据库配置环境prod");
9 }
10 }
上述的三个数据库连接配置的实现类中,在类上都用了@Configuration注解将自定义类声明为配置类,这样可以保证Spring Boot可以自动扫描和识别,同时使用@Profile("xx")注解进行多环境配置声明,并通过属性值进行不同环境标识。在具体的数据库连接配置方法configure()中,示例中只是做了简单的输出语句打印,具体配置可以根据实际开发需求进行编写。
(3)为了激活上述使用@Profile注解构建的多环境配置,需要在项目的resources目录下的全局配置文件application.properties中,配置spring.profiles.active属性来对@Profile("xx")注解标识的多环境配置类进行激活。
需要说明的是,在上一小节演示过程中,在全局配置文件中已经配置了“spring.profiles.active=dev”来激活标识为dev的多环境配置,此处就可以不需要修改了。
(4)为了方便测试@Profile注解效果,在chapter02项目下新建一个com.itheima.controller包,并在该包下创建一个DBController类进行数据库配置连接测试,内容如文件5所示。
文件5 DBController.java
1 import com.itheima.config.DBConnector;
2 import org.springframework.beans.factory.annotation.Autowired;
3 import org.springframework.web.bind.annotation.GetMapping;
4 import org.springframework.web.bind.annotation.RestController;
5 @RestController
6 public class DBController {
7 @Autowired
8 private DBConnector dbConnector;
9 @GetMapping("/showDB")
10 public void showDB(){
11 dbConnector.configure();
12 }
13 }
文件5中,通过@Autowired注解注入了DBConnector实体类对象,并在showDB()方法调用了多环境配置类中的数据库具体配置。其中,@GetMapping("/showDB")注解将服务请求路径设定为“/showDB”,该注解也是一个组合注解,用于对“/showDB”路径的GET请求方式进行 映射。
(5)完成上述步骤@Profile注解多环境配置类的编写后,直接启动chapter02项目的启动类Chapter02Application,查看控制台输出效果,结果如图1所示。
图1 程序测试效果
从图1可以看出,程序正常启动,并且之前通过Profile文件配置的多环境仍然生效,显示端口号为dev开发环境的端口号8081。
接着,在浏览器上访问“http://localhost:8081/showDB
”,查看控制台输出效果,结果如图2所示。
图2 程序测试效果
从图2可以看出,根据映射规则和服务端口号,正确请求到了对应的数据库连接配置方法,并在控制台打印出了指定标识为dev的数据库配置信息。这也就说明,无论使用Profile文件还是@Profile注解类都可以进行多环境配置,并且相互之间不会干扰。