繁体   English   中英

在将Spring解析的属性注入bean之前,如何对其进行修改

[英]How to modify properties resolved by Spring before their injection into beans

我需要为Spring应用程序中的外部属性解密提供支持。 我计划使用spring-cloud-config中的一种机制,该机制在Environment准备就绪后触发,并添加具有更高优先级的解密属性。 不幸的是,它严重依赖于Spring Boot引导机制,该机制会发出ApplicationEnvironmentPreparedEvent 查看Spring Framework代码,环境和上下文创建是高度耦合的,并且在它们之间运行我自己的代码将相当困难。 我正在使用的应用程序是一个大型的,多模块的“标准” Spring MVC应用程序,我现在不希望将其转换为Spring引导应用程序。

问题

在Spring( 不是Spring Boot )应用程序中,在创建环境之后以及在创建上下文之前(在将属性注入到“普通” bean中之前修改属性)之前,我如何执行代码?

替代问题

还有其他方法可以控制注入到bean中的属性(用于修改最初由Spring解析的值)吗?

您可以创建一个自定义ApplicationContextInitializer ,以向您选择的PropertySource添加解密或其他内容。

我们在当前开发的应用程序中做了一些类似的事情。 从文件和数据库加载一些自定义属性后,我们将所有可用的PropertySource包装在EncryptablePropertySource因为已加密了多个属性(为此,我们使用Jasypt库)。

在setter方法上使用@Value("${propname}")批注,而不是在字段上使用。

您可以编写代码来处理setter方法中的变换/验证属性,然后将其分配给该字段。

在平均时间我已经发现customizeContext在方法ContextLoader其中读取定义ApplicationContextInitializer秒。 它是在创建环境之后且重新加载上下文之前执行的,因此初始化程序中的解密应该起作用(至少在基本情况下):

ConfigurableEnvironment env = wac.getEnvironment();
(...) 
customizeContext(sc, wac);
wac.refresh();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM