如何修改Spring在注入bean之前解析的属性

时间:2014-11-14 11:14:14

标签: java spring spring-boot

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

问题

如何在环境创建之后和创建上下文之前执行我的代码(在将属性注入#34;普通" bean之前修改属性)(不是Spring Boot )申请?

替代问题

有没有其他方法来控制注入bean的属性(对于最初由Spring解析的修改值)?

3 个答案:

答案 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();