一、前言
之前的公司接触的基本都是业务方面的代码,很少会对源码进行重写。进入新公司后,跟着一个大佬同事学到了一项新技能,在此记录一下。
需求是我需要对yaml文件中的关键敏感信息进行加密,我们这引入了 jasypt 加密工具。
二、引入加密工具
<!-- 敏感信息进行加密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
因为我们用shardingsphere进行了分表,所以涉及到两个配置文件,application.yml (spring-boot配置文件) 与sharding-dev.yml (sharding-sphere分表配置文件)
三、重写源码的不同场景
1. 重写以覆盖原始行为
-
包名需要一致: 如果你希望通过重写类来替换 Spring Boot 或依赖库中的某个类的默认行为,那么你需要将你的类的包名和类名与原始类保持完全一致。
Spring Boot 会优先加载你定义的类,而不是加载依赖中的原始类。例如:
package org.springframework.boot.autoconfigure; public class MyCustomAutoConfiguration { // 重写逻辑 } -
适用场景:
- 修改默认配置类。
- 覆盖某些工具类的逻辑
2. 重写以扩展功能(非覆盖原始类)
-
包名可以不同: 如果你只是想扩展功能,而不是替换原始类的行为,则可以使用不同的包名。这种方式更安全,也不容易引起兼容性问题。
例如,创建自定义的工具类或组件:
复制代码 package com.example.custom; public class MyCustomUtility { // 自定义功能 } -
适用场景:
- 增加自定义功能,而不修改原始类。
- 避免与原始类冲突。
3. 注意事项
- 类加载顺序:如果重写的类与原始类同名且同包,Spring Boot 项目启动时可能会优先加载你的类。确保测试充分,以避免意外行为。
- 源码维护:重写源码可能导致未来依赖升级时出现兼容性问题。如果可以,优先通过继承、装饰器模式或其他方式实现扩展。
- 依赖关系:检查 Maven/Gradle 的依赖优先级,确保你的类被加载,而不是原始类。
四、重写HikariConfig
接下来的关键,重写hikari的配置HikariConfig
适用场景:
- 修改默认配置类。
- 覆盖某些工具类的逻辑。
public class HikariConfig implements HikariConfigMXBean
{
// 自定义参数
private Properties myDataSourceProperties;
// 设置自定义参数
public void setMyDataSourceProperties(Properties myDataSourceProperties) {
this.myDataSourceProperties = myDataSourceProperties;
// 进行密码解密
// 解密逻辑
// ....
this.setPassword(password);
}
}
以上结束。
总结:关键是要有追踪源码的能力,这也是以后需要提升的地方。