当加密算法遇上SpringBoot Starter:打造属于你的瑞士军刀
"加密就像编程世界的魔法咒语",我对着咖啡杯里的拉花喃喃自语。作为996战士,每次看到项目里散落各处的MD5、SHA256和BCrypt就像看到一屋子没收拾的乐高积木。直到那天,我决定用SpringBoot Starter打造一把加密瑞士军刀——现在,让我带你一起铸造这件神器!
一、起手式:铸造剑胚
我们先来锻造Starter的基础结构:
encryption-spring-boot-starter
├── src/main/java
│ ├── com
│ └── wizard
│ ├── autoconfigure
│ │ ├── EncryptionAutoConfiguration.java # 自动配置核心
│ │ └── EncryptionProperties.java # 配置属性类
│ └── algorithm
│ ├── EncryptionAlgorithm.java # 算法接口
│ ├── MD5Encryption.java # 具体实现
│ ├── SHA256Encryption.java
│ └── BCryptEncryption.java
└── resources
└── META-INF
└── spring.factories # 自动配置入口
二、注入灵魂:配置先知
我们的先知EncryptionProperties能解读application.yml的密语:
@ConfigurationProperties(prefix = "wizard.encryption")
public class EncryptionProperties {
private boolean enabled = true; // 总开关
private AlgorithmType algorithm = AlgorithmType.MD5; // 默认算法
private String salt; // 盐值
public enum AlgorithmType {
MD5, SHA256, BCRYPT
}
// 省略getter/setter
}
在application.yml写下咒语:
wizard:
encryption:
enabled: true # 开启加密模块
algorithm: BCRYPT # 选择BCrypt算法
salt: magic_salt # 配置魔法盐
三、核心法阵:自动配置
我们的自动配置类就像会思考的魔导书:
@Configuration
@ConditionalOnClass(EncryptionAlgorithm.class) // 类路径存在时生效
@EnableConfigurationProperties(EncryptionProperties.class)
public class EncryptionAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 用户未自定义时生效
@ConditionalOnProperty(prefix = "wizard.encryption",
name = "enabled",
havingValue = "true")
public EncryptionAlgorithm encryptionAlgorithm(EncryptionProperties properties) {
switch (properties.getAlgorithm()) {
case MD5:
return new MD5Encryption(properties.getSalt());
case SHA256:
return new SHA256Encryption(properties.getSalt());
case BCRYPT:
return new BCryptEncryption();
default:
throw new IllegalArgumentException("未知的加密算法");
}
}
}
四、铸造利刃:算法实现
我们的加密算法如同不同的魔法符文:
public interface EncryptionAlgorithm {
String encrypt(String rawText);
}
public class BCryptEncryption implements EncryptionAlgorithm {
@Override
public String encrypt(String rawText) {
return BCrypt.hashpw(rawText, BCrypt.gensalt());
}
}
public class SHA256Encryption implements EncryptionAlgorithm {
private final String salt;
public String encrypt(String rawText) {
return DigestUtils.sha256Hex(rawText + salt);
}
}
五、召唤仪式:启用配置
在spring.factories写下召唤阵:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.wizard.autoconfigure.EncryptionAutoConfiguration
六、实战演练:巫师时刻
现在,其他开发者只需引入你的starter依赖:
<dependency>
<groupId>com.wizard</groupId>
<artifactId>encryption-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
然后在业务代码中潇洒使用:
@RestController
public class SecretController {
@Autowired
private EncryptionAlgorithm encryptor;
@PostMapping("/encrypt")
public String encryptMessage(@RequestBody String message) {
return "加密结果:" + encryptor.encrypt(message);
}
}
七、魔改技巧:扩展你的军刀
想添加AES加密?简单!
- 新增AESEncryption实现类
- 在AlgorithmType枚举添加AES
- 在自动配置类添加case分支
- 现在你可以通过配置切换AES算法了!
case AES:
return new AESEncryption(properties.getSecretKey());
八、防翻车指南
当你的咒语不灵时:
- 检查
@Conditional条件是否满足 - 确认配置前缀是否拼写正确
- 查看依赖是否正常引入
- 在启动时添加
--debug参数查看自动配置报告
"好的Starter就像空气,用户感受不到它的存在,却离不开它的支持。" —— 某个秃顶的架构师
现在,去打造属于你的SpringBoot Starter吧!当你看到同事们在yml里轻松切换加密算法时,深藏功与名的微笑就是最好的奖赏。