开发阶段
SpringBoot本身对项目的多环境配置已经做了非常友好的支持了,我们只需按照SpringBoot的约定去做就好。首先我们都知道,SpringBoot的默认配置文件是application.yml
。
配置多个环境只需要将默认配置文件复制几份,然后将文件名按照application-环境名.yml
改为相应的名称,比如:
- 测试环境:
application-dev.yml
- 生成环境:
application-prod.yml
我们可以将多个环境相同的配置写在application.yml
默认配置文件中,然后不同环境的配置写在各自的文件中,比如各种服务的连接信息等。
编辑好配置文件之后,我们需要在默认的配置文件中声明让哪种环境生效
# 激活指定配置文件 spring: profiles: active: prod
注意这里的名称只需要填写application-环境名.yml
配置文件的环境名
部分即可。
举例
首先我创建了一个测试项目,创建了默认的配置文件application.yml
。然后我也创建了application-dev.yml
和application-prod.yml
,并做了以下配置
application.yml
server: servlet: context-path: /moti-graph port: 8081 # 激活指定配置文件 spring: profiles: active: prod
application-dev.yml
spring: neo4j: uri: bolt://localhost:7687 authentication: username: neo4j password: neo4j
application-prod.yml
spring: neo4j: uri: bolt://47.106.183.193:7687 authentication: username: neo4j password: 12345
可以看到,我这里指明生效的是application-prod.yml
,之后我们启动项目,在控制台就可以看到这句话
如果配置生效的是其他环境的配置,那么在这里也会相应的打印出环境名称
发布阶段
当项目需要打包发布到服务器上的时候,打包的结果首先默认会根据你在application.yml
声明生效的环境,所以打包发布的时候可以先确认一下是否将默认配置文件中的环境配置为生产环境。
使用Maven打包,默认会将配置文件打包到jar包内部。可以直接使用java -jar XXX.jar
的方式启动项目
如果想要切换环境,可以直接在命令中添加参数--spring.profiles.active=环境名
java -jar --spring.profiles.active=dev moti-graph-0.0.1-SNAPSHOT.jar
当然也可以在启动项目的时候指定外部的配置文件,同样需要在命令中添加参数即可
我在项目外部创建了一个配置文件如下
server: servlet: context-path: / port: 8888
使用下面的命令启动项目
java -jar moti-graph-0.0.1-SNAPSHOT.jar --spring.config.location=/Users/moti/Desktop/application.yml
当然,项目真正发布的时候肯定不是直接使用这种简单粗暴的java -jar
方式,一般都会有专门的人写shell脚本,然后通过脚本来实现启动、停止、重启等操作。
@Profile注解
当我们开发一个复杂的应用程序时,经常需要根据不同的环境来配置和部署应用。Spring Boot 提供了 @Profile 注解,它可以帮助我们根据不同的配置文件选择不同的 Bean 定义,以适应不同的运行环境。
使用 @Profile 注解可以帮助我们根据不同的环境选择不同的 Bean 定义,从而适应不同的运行环境。这对于实现环境隔离和配置管理非常有用。
@Profile 注解可以用在类级别或方法级别上。当用在类级别时,它将作用于该类中所有的 Bean 定义。当用在方法级别时,它将仅作用于该方法返回的 Bean 定义。
使用 @Profile 注解时,我们需要在配置文件中设置一个或多个激活的 profile。配置文件可以是 application.properties 或 application.yml。例如,我们可以在 application.properties 文件中设置 spring.profiles.active=dev
,表示当前激活的 profile 为 dev。
在使用 @Profile 注解时,我们可以将其与 @Configuration、@Component、@ComponentScan 等注解一起使用。以下是一些示例:
在类上使用:
@Configuration @Profile("dev") public class DevConfig { // 针对开发环境的配置 }
在上面的示例中,DevConfig 类将仅在 dev profile 激活时生效。
在方法上使用
@Configuration public class AppConfig { @Bean @Profile("dev") public DataSource devDataSource() { // 返回开发环境的数据源 } @Bean @Profile("prod") public DataSource prodDataSource() { // 返回生产环境的数据源 } }
在上面的示例中,根据激活的 profile 不同,将返回不同的 DataSource 实例。
在 @ComponentScan 注解中使用
@Configuration @ComponentScan(basePackages = "com.example", excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = DevConfig.class)) @Profile("prod") public class AppConfig { // 针对生产环境的配置 }
在上面的示例中,AppConfig 将仅在 prod profile 激活时生效,并排除 DevConfig 类的扫描。