环境切换大法:掌握Spring Boot多套配置与@Profile注解的高级技巧

发布时间:2024年01月18日

开发阶段

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.ymlapplication-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,之后我们启动项目,在控制台就可以看到这句话

image.png

如果配置生效的是其他环境的配置,那么在这里也会相应的打印出环境名称

发布阶段

当项目需要打包发布到服务器上的时候,打包的结果首先默认会根据你在application.yml声明生效的环境,所以打包发布的时候可以先确认一下是否将默认配置文件中的环境配置为生产环境。

使用Maven打包,默认会将配置文件打包到jar包内部。可以直接使用java -jar XXX.jar的方式启动项目

image.png

如果想要切换环境,可以直接在命令中添加参数--spring.profiles.active=环境名

java -jar --spring.profiles.active=dev moti-graph-0.0.1-SNAPSHOT.jar

image.png

当然也可以在启动项目的时候指定外部的配置文件,同样需要在命令中添加参数即可

我在项目外部创建了一个配置文件如下

server:
  servlet:
    context-path: /
  port: 8888

使用下面的命令启动项目

java -jar moti-graph-0.0.1-SNAPSHOT.jar --spring.config.location=/Users/moti/Desktop/application.yml

image.png

当然,项目真正发布的时候肯定不是直接使用这种简单粗暴的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 类的扫描。

文章来源:https://blog.csdn.net/weixin_53287520/article/details/135593294
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。