我需要在Spring应用程序中为外部属性解密提供支持。我计划使用spring-cloud-config中的机制,该机制在Environment
准备就绪后触发,并添加具有更高优先级的解密属性。不幸的是,它严重依赖于发出ApplicationEnvironmentPreparedEvent
的Spring Boot引导机制。查看Spring Framework代码,环境和上下文创建是高度耦合的,在它之间运行我自己的代码会相当困难。我正在使用的应用程序是一个大型的多模块"标准" Spring MVC应用程序,我现在不想将它转换为Spring启动应用程序。
问题:
如何在环境创建之后和创建上下文之前执行我的代码(在将属性注入#34;普通" bean之前修改属性)(不是Spring Boot )申请?
替代问题:
有没有其他方法来控制注入bean的属性(对于最初由Spring解析的修改值)?
答案 0 :(得分:2)
您可以创建一个自定义ApplicationContextInitializer
,为您选择的PropertySource
添加解密或其他内容。
我们在目前开发的应用程序之一中做了类似的事情。从文件和数据库加载一些自定义属性后,我们将所有可用的PropertySource
包装在EncryptablePropertySource
中,因为有几个属性已加密(我们使用Jasypt库)。
答案 1 :(得分:0)
在setter方法上使用@Value("${propname}")
注释,而不是在字段上使用。
您可以编写代码来处理setter方法中的属性转换/验证属性,然后分配给该字段。
答案 2 :(得分:0)
与此同时,我在customizeContext
中找到了ContextLoader
方法,该方法读取定义的ApplicationContextInitializer
。它是在环境创建之后和重新加载上下文之前执行的,因此初始化程序中的解密应该起作用(至少在基本情况下):
ConfigurableEnvironment env = wac.getEnvironment();
(...)
customizeContext(sc, wac);
wac.refresh();