[046][Crypto模块]Spring Boot 自动配置进阶:按需装配加解密处理器
[046][Crypto模块]Spring Boot 自动配置进阶按需装配加解密处理器本项目代码: https://gitee.com/yunjiao-source/tutorials4jSpring Boot 的自动配置Auto-Configuration极大地简化了组件集成。本文以一个加解密框架为例深入讲解如何利用ConditionalOnMissingBean、EnableConfigurationProperties以及多个配置类的拆分实现灵活的按需装配。一、配置属性类CryptoProperties首先定义框架需要的配置项使用ConfigurationProperties绑定application.yml中的前缀DataConfigurationProperties(prefixtutorials4j.crypto)publicclassCryptoProperties{privateAsymmetricCryptoStrategyasymmetricCryptoStrategyAsymmetricCryptoStrategy.STANDARD;privateStringsecretKeyHex;// 对称密钥privateStringprivateKeyHex;// 非对称私钥privateStringpublicKeyHex;// 非对称公钥privateStringsalt;// 摘要盐值privateintsaltPosition0;privateintdigestCount1;}用户可在application.yml中配置tutorials4j:crypto:asymmetric-crypto-strategy:SM# 使用 SM2secret-key-hex:abcd1234...salt:my-salt二、核心自动配置类CryptoConfiguration这个类负责将底层的工厂 Bean 装配到 Spring 容器中Configuration(proxyBeanMethodsfalse)EnableConfigurationProperties(CryptoProperties.class)publicclassCryptoConfiguration{BeanConditionalOnMissingBeanCryptoProcessorFactorycryptoProcessorFactory(ObjectProviderCryptoProcessorproviders){// 收集所有 CryptoProcessor 并注册到工厂}BeanConditionalOnMissingBeanDigestProcessorFactorydigestProcessorFactory(ObjectProviderDigestProcessorproviders){// 收集所有 DigestProcessor}}ConditionalOnMissingBean是关键如果用户已经自定义了工厂 Bean则不会重复创建允许覆盖默认行为。三、Hutool 实现自动配置HutoolCryptoConfiguration具体的加密算法实现基于 Hutool在另一个配置类中按需创建各个处理器的 BeanConfiguration(proxyBeanMethodsfalse)publicclassHutoolCryptoConfiguration{BeanConditionalOnMissingBeanAESCryptoProcessoraesCryptoProcessor(CryptoPropertiesproperties){if(StringUtils.isBlank(properties.getSecretKeyHex())){returnAESCryptoProcessor.create();// 自动生成密钥}else{returnAESCryptoProcessor.create(newSecretKey(properties.getSecretKeyHex()));}}BeanConditionalOnMissingBeanSM2CryptoProcessorsm2CryptoProcessor(CryptoPropertiesproperties){// 从配置中读取公钥私钥或自动生成}// 其他处理器类似...}这里每个Bean都使用了ConditionalOnMissingBean允许用户覆盖特定处理器的实现。例如如果用户想自定义一个增强版的 AES 处理器只需在项目中声明一个AESCryptoProcessor类型的Bean框架自动配置就会跳过默认创建。四、Web 功能自动配置CryptoWebConfiguration如果项目中需要请求体自动解密功能再添加一个独立的配置类Configuration(proxyBeanMethodsfalse)publicclassCryptoWebConfiguration{BeanConditionalOnMissingBeanCryptoRequestBodyAdvicecryptoRequestBodyAdvice(CryptoPropertiesproperties){CryptoProcessorprocessorCryptoProcessorFactory.instance.findProcessor(properties.getAsymmetricCryptoStrategy().getCategory());returnnewCryptoRequestBodyAdvice(processor);}BeanConditionalOnMissingBeanCryptoEndpointcryptoEndpoint(CryptoPropertiesproperties){returnnewCryptoEndpoint(properties);}}这样做的好处是如果用户不需要 Web 功能例如纯后端服务可以不引入crypto-web模块自动配置就不会生效避免了不必要的 Bean 创建。五、条件装配的进阶用法除了ConditionalOnMissingBeanSpring Boot 还提供了很多条件注解框架未来可以进一步扩展ConditionalOnProperty只有配置了某个属性才创建 Bean。例如可设置tutorials4j.crypto.enabledtrue来全局开关。ConditionalOnClass只在类路径存在某个类时才装配。例如检测到 Hutool 的类才创建 Hutool 处理器。ConditionalOnWebApplication只在 Web 环境下装配CryptoWebConfiguration。六、日志输出与调试在每个配置类中使用PostConstruct打印日志方便用户确认配置是否生效PostConstructpublicvoidpostConstruct(){log.debug([CRYPTO-CORE] Crypto Configuration);}用户开启debug日志级别后可以看到框架装配了哪些处理器密钥是否自动生成等关键信息。七、总结通过合理的拆分和条件化配置Spring Boot Starter 级别的框架可以达到按需加载用户引入crypto-hutool依赖才激活 Hutool 实现引入crypto-web才激活 Web 解密功能。易于覆盖ConditionalOnMissingBean给用户最大的定制空间。配置集中所有配置项通过ConfigurationProperties统一管理支持yaml自动提示。低入侵框架不会强制用户使用特定的配置方式默认值保证了开箱即用。这种设计模式是开发企业内部通用 starter 的最佳实践值得参考。