ITPub博客

首页 > 数据库 > 数据库开发技术 > 五个实用的 Spring Boot 小技巧,提升你的开发效率

五个实用的 Spring Boot 小技巧,提升你的开发效率

原创 数据库开发技术 作者:IT枫斗者 时间:2024-12-16 17:25:00 0 删除 编辑

五个实用的 Spring Boot 小技巧,提升你的开发效率


引言

在现代 Java 开发中,Spring Boot 凭借其简化配置、快速开发和强大的微服务支持,成为众多开发者的首选框架。
本文结合实际项目中的经验,分享五个高效的 Spring Boot 使用技巧,帮助你更好地应对开发中的常见挑战。
让我们一起来看看你掌握了多少吧!





1. 在 Spring Boot 启动时执行初始化逻辑



背景

在项目的某次迭代中,数据库中的某张表新增了一个字段。这个字段与业务逻辑紧密相关,需根据特定业务规则为其赋值。
传统的做法是在数据库更新前手动编写 SQL 语句进行字段赋值,但这种方法不仅效率低下,还容易在不同环境中操作失误。


解决方案

利用 Spring Boot 的特性,在项目启动时自动执行初始化逻辑,实现字段的自动更新,提升效率并减少人为错误。


实现步骤

Spring Boot 提供了多种方式在应用启动时执行初始化代码:


  • 使用 CommandLineRunner 接口

@Slf4j@Componentpublic class DatabaseInitializer implements CommandLineRunner {   @Override   public void run(String... args) {       // 这里编写初始化逻辑,例如更新数据库字段       log.info("执行数据库初始化操作...");   }}


  • 使用 ApplicationRunner 接口

@Slf4j@Componentpublic class DatabaseInitializer implements ApplicationRunner {   @Override   public void run(ApplicationArguments args) {       // 这里编写初始化逻辑,例如更新数据库字段       log.info("执行数据库初始化操作...");   }}


  • 监听应用上下文刷新事件

@Slf4j@Configurationpublic class ContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {   @Override   public void onApplicationEvent(ContextRefreshedEvent event) {       // 这里编写初始化逻辑,例如更新数据库字段       log.info("执行数据库初始化操作...");   }}



确保初始化逻辑只执行一次

为了防止初始化逻辑在每次启动时重复执行,可以在数据库中添加一个标识字段。
例如,在字典表中增加一个 initialized 字段,每次执行初始化前先检查该字段是否已设置,若已设置则跳过初始化。
if (!dictionaryService.isInitialized()) {   // 执行初始化操作   dictionaryService.initialize();   dictionaryService.setInitialized(true);}




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



背景

在某些项目中,可能需要根据不同的环境或配置动态加载数据源。例如,通过在 application.yml 中添加一个开关,来决定是否启用数据库连接。


实现方法

1. 禁用 Spring Boot 的数据源自动配置

在启动类上添加以下注解,排除默认的数据源自动配置:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })public class Application {   public static void main(String[] args) {       SpringApplication.run(Application.class, args);   }}


2. 创建自定义的数据源配置类

使用 @ConditionalOnProperty 注解,根据配置文件中的属性决定是否加载数据源:

@Configuration@ConditionalOnProperty(name = "spring.datasource.enabled", havingValue = "true")public class DataSourceConfig {   @Bean   public DataSource dataSource() {       // 配置数据源,例如 HikariDataSource       HikariDataSource dataSource = new HikariDataSource();       dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");       dataSource.setUsername("root");       dataSource.setPassword("password");       return dataSource;   }}


3. 调整仓库类的依赖注入

对于需要注入数据源的仓库类,使用 @Autowired(required = false),确保在数据源未加载时不会导致应用启动失败:

@Repositorypublic class MyRepository {   @Autowired(required = false)   private JdbcTemplate jdbcTemplate;   // 使用 jdbcTemplate 执行数据库操作}


4. 在配置文件中控制数据源的启用状态

spring: datasource:   enabled: true  # 设置为 false 时,数据源不会被加载

这样,通过修改 application.yml 中的 spring.datasource.enabled 属性,可以灵活地控制数据源的加载。




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



背景

在实际开发中,同一个项目通常需要在开发、测试和生产等不同环境下运行。不同环境的配置(如数据库连接、缓存配置等)可能存在差异。
为了简化配置管理,期望在应用启动时根据环境自动加载相应的配置文件。


实现方法



使用 Spring Profiles

Spring 提供了 Profiles 功能,可以根据激活的环境配置不同的属性。


1. 创建不同环境的配置文件

  • application-dev.yml(开发环境)

  • application-test.yml(测试环境)

  • application-prod.yml(生产环境)


每个文件中包含对应环境的配置:

# application-dev.ymlspring: datasource:   url: jdbc:mysql://localhost:3306/devdb   username: devuser   password: devpass
# application-test.ymlspring: datasource:   url: jdbc:mysql://localhost:3306/testdb   username: testuser   password: testpass
# application-prod.ymlspring: datasource:   url: jdbc:mysql://localhost:3306/proddb   username: produser   password: prodpass


2. 在启动时指定激活的 Profile

通过命令行参数指定要激活的环境:

java -jar yourapp.jar --spring.profiles.active=dev或者在 application.yml 中默认指定:spring: profiles:   active: dev





使用 Nacos 进行配置管理

结合 Nacos 等配置中心,可以更灵活地管理不同环境的配置:

spring: profiles: dev cloud:   nacos:     discovery:       server-addr: 127.0.0.1:8848     config:       server-addr: ${spring.cloud.nacos.discovery.server-addr}       extension-configs:         - data-id: database-dev.yaml           group: DEFAULT_GROUP           refresh: true         - data-id: redis-dev.yaml           group: DEFAULT_GROUP           refresh: true


通过这种方式,可以在不同的配置文件中定义各自环境的配置,确保应用在不同环境下的行为一致且可控。




4. 配置文件加密,保障敏感信息安全



背景

在 Spring Boot 的配置文件中,往往包含了诸如数据库密码、API 密钥等敏感信息。
以明文形式存储这些信息存在安全隐患,尤其是在代码仓库中。
为此,需要对配置文件中的敏感信息进行加密,确保数据安全。


实现步骤



引入 Jasypt 依赖


在 pom.xml 中添加 Jasypt 的 Spring Boot 启动器依赖:

<dependency>   <groupId>com.github.ulisesbocchio</groupId>   <artifactId>jasypt-spring-boot-starter</artifactId>   <version>3.0.4</version></dependency>

注意:确保使用最新版本,以获得最佳的安全性和功能支持。




配置加密器


在 application.yml 中配置加密器的密码和算法:

jasypt: encryptor:   password: your-encryption-password  # 加密密钥,建议通过环境变量传递   algorithm: PBEWithMD5AndDES

安全提示:为了防止加密密钥泄露,建议将 jasypt.encryptor.password 设置为环境变量或通过启动参数传递,而不是直接写在配置文件中。




加密敏感信息


编写一个测试用例,使用 Jasypt 加密敏感信息:

@RunWith(SpringRunner.class)@SpringBootTestpublic class EncryptTest {   @Autowired   private StringEncryptor encryptor;   @Test   public void encryptProperties() {       String url = encryptor.encrypt("jdbc:mysql://localhost:3306/mydb");       String username = encryptor.encrypt("root");       String password = encryptor.encrypt("password123");       System.out.println("Encrypted URL: " + url);       System.out.println("Encrypted Username: " + username);       System.out.println("Encrypted Password: " + password);   }}


运行测试后,将输出加密后的字符串,将其替换到 application.yml 中对应的位置:

spring: datasource:   url: ENC(encrypted-url-string)   username: ENC(encrypted-username-string)   password: ENC(encrypted-password-string)





启动时传递加密密钥


为了确保应用在启动时能够解密配置,需要通过环境变量或启动参数传递加密密钥:


  • 使用环境变量

export JASYPT_ENCRYPTOR_PASSWORD=your-encryption-password


  • 使用启动参数

java -jar yourapp.jar --jasypt.encryptor.password=your-encryption-password


通过这种方式,即使配置文件被泄露,敏感信息依然是安全的,因为需要加密密钥才能解密。




5. 精简打包后的 JAR 文件,提升部署效率



背景

Spring Boot 项目打包后的 JAR 文件通常体积较大,常常达到几百 MB。如果仅仅是进行小规模的更新或修复,重新打包并部署整个 JAR 文件显得十分低效。
为了提升部署效率,期望能够精简 JAR 文件的体积,避免不必要的内容重复上传。


解决方案

通过调整 Maven 的打包配置,将部分不常变动的依赖项外置,从而减小 JAR 文件的体积。


实现步骤

配置 Maven 插件

在 pom.xml 中配置 spring-boot-maven-plugin 和 maven-dependency-plugin:
<build>   <plugins>       <!-- Spring Boot Maven 插件 -->       <plugin>           <groupId>org.springframework.boot</groupId>           <artifactId>spring-boot-maven-plugin</artifactId>           <configuration>               <executable>true</executable>               <layout>ZIP</layout>               <!-- 指定需要内置的依赖,未列出的依赖将外置 -->               <includes>                   <include>                       <groupId>com.example</groupId>                       <artifactId>common-library</artifactId>                   </include>               </includes>           </configuration>       </plugin>       <!-- Maven 依赖插件,用于复制依赖到外部目录 -->       <plugin>           <groupId>org.apache.maven.plugins</groupId>           <artifactId>maven-dependency-plugin</artifactId>           <version>3.1.2</version>           <executions>               <execution>                   <id>copy-dependencies</id>                   <phase>package</phase>                   <goals>                       <goal>copy-dependencies</goal>                   </goals>                   <configuration>                       <outputDirectory>${project.build.directory}/lib</outputDirectory>                       <includeScope>runtime</includeScope>                   </configuration>               </execution>           </executions>       </plugin>   </plugins></build>


打包项目

执行 Maven 打包命令:
mvn clean package
这将生成一个精简的 JAR 文件和一个 lib 目录,lib 中包含了所有外置的依赖。


启动应用时指定外部依赖路径

使用 loader.path 参数指定外部依赖的目录:
java -Dloader.path=./lib -jar yourapp.jar
这样,Spring Boot 应用会从 lib 目录加载依赖,而不再将其包含在 JAR 文件中,从而大幅减小 JAR 文件的体积。


优点

节省带宽:

上传的 JAR 文件更小,节省网络带宽和时间。

加快部署:

减少文件传输和解压时间,加快部署速度。

灵活管理依赖:

常见依赖可以集中管理,便于版本控制和更新。

    注意事项

    依赖稳定性:

    外置的依赖版本应保持稳定,避免在不同环境中出现版本不一致的问题。

    服务器配置:

    确保部署服务器上存在外置依赖的 lib 目录,并具备相应的访问权限。




    总结


    以上五个 Spring Boot 的实用小技巧,涵盖了应用初始化、数据源管理、环境配置、配置安全以及打包优化等方面。合理运用这些技巧,能够显著提升开发效率、增强应用的安全性,并优化部署流程。希望这些内容对你在 Spring Boot 项目中的开发有所帮助!





    👋 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。
    欢迎关注我的公众号,期待与你一起探讨技术的无穷可能!” 目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。
    加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作


    —END—


    原文作者:IT枫斗者;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论
    大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。技术交流vx:itfdz666,拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。看面试实战视频可以关注b站号:IT枫斗者–Java面试。需要看技术文章,可以关注CSDN:IT枫斗者。

    注册时间:2020-05-13

    • 博文量
      183
    • 访问量
      81344