[046][Crypto模块]Spring Boot 自动配置进阶:按需装配加解密处理器

简介: 本文详解Spring Boot自动配置进阶实践:基于Crypto模块,通过`@ConditionalOnMissingBean`、`@EnableConfigurationProperties`等注解,实现加解密处理器的按需装配与灵活覆盖。涵盖配置属性绑定、多配置类拆分、条件加载(Web/非Web)、日志调试及Hutool集成,助力构建高可扩展Starter。

[046][Crypto模块]Spring Boot 自动配置进阶:按需装配加解密处理器

Spring Boot 的自动配置(Auto-Configuration)极大地简化了组件集成。本文以一个加解密框架为例,深入讲解如何利用 @ConditionalOnMissingBean、@EnableConfigurationProperties 以及多个配置类的拆分,实现灵活的按需装配。

一、配置属性类:CryptoProperties

首先定义框架需要的配置项,使用 @ConfigurationProperties 绑定 application.yml 中的前缀:

@Data
@ConfigurationProperties(prefix = "tutorials4j.crypto")
public class CryptoProperties {
   
    private AsymmetricCryptoStrategy asymmetricCryptoStrategy = AsymmetricCryptoStrategy.STANDARD;
    private String secretKeyHex;    // 对称密钥
    private String privateKeyHex;   // 非对称私钥
    private String publicKeyHex;    // 非对称公钥
    private String salt;            // 摘要盐值
    private int saltPosition = 0;
    private int digestCount = 1;
}

用户可在 application.yml 中配置:

tutorials4j:
  crypto:
    asymmetric-crypto-strategy: SM   # 使用 SM2
    secret-key-hex: "abcd1234..."
    salt: "my-salt"

二、核心自动配置类:CryptoConfiguration

这个类负责将底层的工厂 Bean 装配到 Spring 容器中:

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(CryptoProperties.class)
public class CryptoConfiguration {
   
    @Bean
    @ConditionalOnMissingBean
    CryptoProcessorFactory cryptoProcessorFactory(ObjectProvider<CryptoProcessor> providers) {
   
        // 收集所有 CryptoProcessor 并注册到工厂
    }

    @Bean
    @ConditionalOnMissingBean
    DigestProcessorFactory digestProcessorFactory(ObjectProvider<DigestProcessor> providers) {
   
        // 收集所有 DigestProcessor
    }
}

@ConditionalOnMissingBean 是关键:如果用户已经自定义了工厂 Bean,则不会重复创建,允许覆盖默认行为。

三、Hutool 实现自动配置:HutoolCryptoConfiguration

具体的加密算法实现(基于 Hutool)在另一个配置类中,按需创建各个处理器的 Bean:

@Configuration(proxyBeanMethods = false)
public class HutoolCryptoConfiguration {
   
    @Bean
    @ConditionalOnMissingBean
    AESCryptoProcessor aesCryptoProcessor(CryptoProperties properties) {
   
        if (StringUtils.isBlank(properties.getSecretKeyHex())) {
   
            return AESCryptoProcessor.create(); // 自动生成密钥
        } else {
   
            return AESCryptoProcessor.create(new SecretKey(properties.getSecretKeyHex()));
        }
    }

    @Bean
    @ConditionalOnMissingBean
    SM2CryptoProcessor sm2CryptoProcessor(CryptoProperties properties) {
   
        // 从配置中读取公钥私钥或自动生成
    }
    // 其他处理器类似...
}

这里每个 @Bean 都使用了 @ConditionalOnMissingBean,允许用户覆盖特定处理器的实现。例如,如果用户想自定义一个增强版的 AES 处理器,只需在项目中声明一个 AESCryptoProcessor 类型的 @Bean,框架自动配置就会跳过默认创建。

四、Web 功能自动配置:CryptoWebConfiguration

如果项目中需要请求体自动解密功能,再添加一个独立的配置类:

@Configuration(proxyBeanMethods = false)
public class CryptoWebConfiguration {
   
    @Bean
    @ConditionalOnMissingBean
    CryptoRequestBodyAdvice cryptoRequestBodyAdvice(CryptoProperties properties) {
   
        CryptoProcessor processor = CryptoProcessorFactory.instance.findProcessor(
            properties.getAsymmetricCryptoStrategy().getCategory());
        return new CryptoRequestBodyAdvice(processor);
    }

    @Bean
    @ConditionalOnMissingBean
    CryptoEndpoint cryptoEndpoint(CryptoProperties properties) {
   
        return new CryptoEndpoint(properties);
    }
}

这样做的好处是:如果用户不需要 Web 功能(例如纯后端服务),可以不引入 crypto-web 模块,自动配置就不会生效,避免了不必要的 Bean 创建。

五、条件装配的进阶用法

除了 @ConditionalOnMissingBean,Spring Boot 还提供了很多条件注解,框架未来可以进一步扩展:

  • @ConditionalOnProperty:只有配置了某个属性才创建 Bean。例如可设置 tutorials4j.crypto.enabled=true 来全局开关。
  • @ConditionalOnClass:只在类路径存在某个类时才装配。例如检测到 Hutool 的类,才创建 Hutool 处理器。
  • @ConditionalOnWebApplication:只在 Web 环境下装配 CryptoWebConfiguration。

六、日志输出与调试

在每个配置类中使用 @PostConstruct 打印日志,方便用户确认配置是否生效:

@PostConstruct
public void postConstruct() {
   
    log.debug("[CRYPTO-CORE] Crypto Configuration");
}

用户开启 debug 日志级别后,可以看到框架装配了哪些处理器,密钥是否自动生成等关键信息。

七、总结

通过合理的拆分和条件化配置,Spring Boot Starter 级别的框架可以达到:

  • 按需加载:用户引入 crypto-hutool 依赖才激活 Hutool 实现;引入 crypto-web 才激活 Web 解密功能。
  • 易于覆盖:@ConditionalOnMissingBean 给用户最大的定制空间。
  • 配置集中:所有配置项通过 @ConfigurationProperties 统一管理,支持 yaml 自动提示。
  • 低入侵:框架不会强制用户使用特定的配置方式,默认值保证了开箱即用。

这种设计模式是开发企业内部通用 starter 的最佳实践,值得参考。

目录
相关文章
|
3月前
|
JSON 安全 Java
[024][Web模块]基于 AntiSamy 的 Spring Boot XSS 防护实践:从过滤器到反序列化的多层防御
本文介绍基于OWASP AntiSamy的Spring Boot XSS多层防护方案:通过Servlet过滤器清洗表单/查询参数,结合Jackson反序列化器净化JSON数据,实现非侵入、全覆盖的输入清洗,业务代码零修改。(239字)
428 2
|
JSON 前端开发 API
TDesign中后台管理系统-用户登录
TDesign中后台管理系统-用户登录
|
2月前
|
缓存 NoSQL Java
[065][缓存模块]Hibernate二级缓存自定义实现:基于Spring Cache的多级缓存适配器
本文介绍了一种基于Spring Cache的Hibernate二级缓存自定义实现,通过适配`DomainDataStorageAccess`与`RegionFactoryTemplate`,统一ORM与应用层缓存。支持本地(Caffeine)、远程(Redis)、多级及租户隔离等灵活策略,配置即生效,无缝集成Spring Boot生态。(239字)
84 2
|
3月前
|
前端开发 Java API
[049][Crypto模块]前后端混合加密API实战:基于Spring Boot的AES+RSA安全传输方案
本文详解Spring Boot中AES+RSA混合加密实战:前端用RSA公钥加密随机AES密钥并传输,后端通过`@Crypto`注解自动解密请求体。涵盖公钥分发、Hex/Base64编码统一、ECB模式适配及Caffeine缓存优化,提供开箱即用的端到端安全传输方案。(239字)
381 0
|
2月前
|
前端开发 安全 Shell
Agent 小知识 | Agent 编排的三种方式:ReAct、Plan-and-Execute 与 Workflow Graph
本文深入解析Agent编排三大范式:ReAct(动态探索未知路径)、Plan-and-Execute(目标明确、可调整的结构化执行)与Workflow Graph(规则固化、安全可控的流程图)。三者非替代关系,而是按任务确定性分层协同——主干用Workflow守边界,子任务用Plan组织,细节用ReAct灵活应对。
240 0
Agent 小知识 | Agent 编排的三种方式:ReAct、Plan-and-Execute 与 Workflow Graph
|
2月前
|
消息中间件 分布式计算 大数据
大数据面试别只背八股!从零到拿下大厂的大数据系统设计备考路线
大数据面试别只背八股!从零到拿下大厂的大数据系统设计备考路线
189 4
|
2月前
|
缓存 算法 Java
PHP 引用计数机制深度解析
本文深度解析PHP引用计数机制,涵盖zval结构、写时复制(COW)、`&`引用本质、循环引用泄漏根源及WeakReference/WeakMap现代解法,辅以实测数据与生产案例,助开发者构建内存心智模型,告别“重启治百病”的黑盒运维。(239字)
108 1
|
2月前
|
人工智能 自然语言处理 供应链
AI 大模型语料采集的图书灰色供应链、版权争议与治理路径研究
本文揭露AI企业为获取高质量训练语料,构建“匿名采购—破坏性扫描—实体销毁”灰色产业链,导致珍稀古籍灭失、版权失衡、钓鱼欺诈混淆及行业秩序紊乱。基于荷兰3000册学术书匿名订单事件,提出图书识别、中介监管、AI合规、版权协同、钓鱼防护五层闭环治理体系。(239字)
153 1
|
3月前
|
缓存 监控 安全
[025][Web模块]基于 Spring Boot 的请求日志过滤器设计与实现
本文介绍基于Spring Boot的可配置请求日志过滤器,通过自定义`WebHttpProperties`、扩展`CommonsRequestLoggingFilter`及自动配置类,支持时间戳、客户端信息、请求头/体记录、动态前缀等灵活配置,开箱即用,兼顾可维护性与生产安全性。(239字)
448 1

热门文章

最新文章