0. 引入

Spring Boot 以其简化配置、快速开发和微服务支持等特点,成为了 Java 开发的首选框架。本文将结合我在实际工作中遇到的问题,分享五个高效的 Spring Boot 的技巧。希望这些技巧能对你有所帮助。

1. Spring Boot 执行初始化逻辑

1.1 背景

项目的某次更新,数据库中的某张表新增了一个字段,且与业务有关联,需要对新建的字段根据对应的业务进行赋值操作。

一种解决方案就是,更新前手动写 SQL 更新字段的值,但这样做的效率太低,而且每给不同环境更新一次,就需要手动执行一次,容易出错且效率低。

另一种方案则是在项目启动时进行初始化操作,完成字段对应值的更新,这种方案效率更高且不容易出错。

1.2 实现

Spring Boot 提供了多种方案用于项目启动后执行初始化的逻辑。

  • 实现CommandLineRunner接口,重写run方法。


@Slf4j
@Component
public class InitListen implements CommandLineRunner {

    @Overridepublic void run(String... args) {// 初始化相关逻辑...}
}
  • 实现ApplicationRunner接口,重写run方法。


@Slf4j
@Component
public class InitListen implements ApplicationRunner {

    @Overridepublic void run(ApplicationArguments args) {// 初始化相关逻辑...}
}
  • 实现ApplicationListener接口


@Slf4j
@Configuration
public class StartClientListener implements ApplicationListener<ContextRefreshedEvent> {

    @Overridepublic void onApplicationEvent(ContextRefreshedEvent arg0) {// 初始化逻辑}
}

针对于上述这个需求,如何实现仅更新一次字段的值?
可在数据库字典表中设置一个更新标识字段,每次执行初始化逻辑之前,校验判断下字典中的这个值,确认是否已经更新,如果已经更新,就不需要再执行更新操作了。


2. Spring Boot 动态控制数据源的加载

2.1 背景

期望通过在application.yml文件中,添加一个开关来控制是否加载数据库。

2.2 实现

启动类上添加注解 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }),代表禁止 Spring Boot 自动注入数据源。

新建 DataSourceConfig配置类,用于初始化数据源。

在DataSourceConfig配置类上添加条件注解 @ConditionalOnProperty(name = "spring.datasource.enabled", havingValue = "true",代表只有当 spring.datasource.enabled 为 true时,加载数据库,其余情况不加载数据库。

仓库类 XxxRepository 的注入,需要使用注解 @Autowired(required = false)


<顺便吆喝一句,技术大厂年前捞人捞人,缺前、后端/测试,感兴趣可以试试,待遇给的还可以~>



3. Spring Boot 根据不同环境加载配置文件

3.1 背景

实际开发工作中,针对同一个项目,可能会存在开发环境、测试环境、正式环境等,不同环境的配置内容可能会不一致,如:数据库、Redis等等。期望在项目在启动时能够针对不同的环境来加载不同的配置文件。

3.2 实现

Spring 提供 Profiles 特性,通过启动时设置指令-Dspring.profiles.active指定加载的配置文件,同一个配置文件中不同的配置使用---来区分。

启动 jar 包时执行命令:

java -jar test.jar -Dspring.profiles.active=dev

-Dspring.profiles.active=dev代表激活 profiles 为 dev 的相关配置。

## 用---区分环境,不同环境获取不同配置
---
# 开发环境
spring:
  profiles: dev
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        # 命名空间为默认,所以不需要写命名空间
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        extension-configs[0]:
          data-id: database-base.yaml
          group: DEFAULT_GROUP
          refresh: true
        extension-configs[1]:
          # 本地单机Redis
          data-id: redis-base-auth.yaml
          group: DEFAULT_GROUP
          refresh: true
        extension-configs[2]:
          data-id: master-base-auth.yaml
          group: DEFAULT_GROUP
          refresh: true
---
#测试环境
spring:
  profiles: test
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.111:8904
        # 测试环境注册的命名空间
        namespace: b80b921d-cd74-4f22-8025-333d9b3d0e1d
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        extension-configs[0]:
          data-id: database-base-test.yaml
          group: DEFAULT_GROUP
          refresh: true
        extension-configs[1]:
          data-id: redis-base-test.yaml
          group: DEFAULT_GROUP
          refresh: true
        extension-configs[2]:
          data-id: master-auth-test.yaml
          group: DEFAULT_GROUP
          refresh: true

---
# 生产环境
spring:
  profiles: prod
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.112:8848
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        extension-configs[0]:
          # 生产环境
          data-id: database-auth.yaml
          group: DEFAULT_GROUP
          refresh: true
        extension-configs[1]:
          # 生产环境
          data-id: redis-base-auth.yaml
          group: DEFAULT_GROUP
          refresh: true
        extension-configs[2]:
          data-id: master-base-auth.yaml
          group: DEFAULT_GROUP
          refresh: true

也可以定义多个配置文件,如在application.yml中定义和环境无关的配置,而application-{profile}.yml则根据环境做不同区分,如在 application-dev.yml 中定义开发环境相关配置、application-test.yml 中定义测试环境相关配置。

启动时指定环境命令同上,仍为:

java -jar test.jar -Dspring.profiles.active=dev


参考资料

zhuanlan.zhihu.com/p/646593227

cloud.tencent.com/developer/a…

——转载自作者:离开地球表面_99

#用---区分环境,不同环境获取不同配置---#
开源硬件平台

还没有评论,抢个沙发!