【问题标题】:Manipulation of Spring Bean propertySpring Bean 属性的操作
【发布时间】:2020-06-09 06:23:01
【问题描述】:

我想更改 bean 的属性。我只想更改一次以提高性能(从 XML 读取时更好),而不是在每个 bean 实例实例化中。春季最好的方法是什么?

为了详细说明并给出一个具体的例子:

以下是databaseContext.xml 中的数据源bean 声明。 我想用 JASYPT 解密值为 ENC(....) 的 ${jdbc.password}。 我无法使用 Jaspt Spring 集成来做到这一点,因为 Jaspt 尚不兼容 Spring5,并且不兼容 Jasypt Hibernate 集成,因为使用了除 Hibernate 之外的其他数据源。

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="poolName" value="springHikariCP" />
        <property name="connectionTestQuery" value="SELECT 1 from dual" />
        <property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource" />
        <property name="maximumPoolSize" value="10" />
        <property name="idleTimeout" value="30000" />

    <property name="dataSourceProperties">
        <props>
            <prop key="url">${jdbc.url}</prop>
            <prop key="user">${jdbc.user}</prop>
            <prop key="password">${jdbc.password}</prop>
        </props>
    </property>
</bean>

【问题讨论】:

    标签: spring properties jasypt


    【解决方案1】:

    这对我帮助很大: Spring property placeholder decrypt resolved property

    只是想对一些发现添加一些小的更正和额外的注释:

    在上面的链接中写的是“位置”,但它必须是下面写的“位置”,它位于 applicationContext.xml 中

    <bean class="com.dummy.util.EncryptationAwarePropertySourcesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath*:database.properties</value>
                <value>classpath*:hibernate.properties</value>
            </list>
        </property>
    </bean>
    

    “PropertyPlaceholderConfigurer”已弃用。但它仍然有效。如果您尝试使用新提出的类“PropertySourcesPlaceholderConfigurer”,它有一个错误,即它不会调用此处所述的“convertPropertyValue”方法:https://github.com/spring-projects/spring-framework/issues/13568。顺便提到的一种解决方法。

    public class EncryptationAwarePropertySourcesPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
    
        @Override
        protected String convertPropertyValue(String originalValue) {
    
            if (originalValue != null && originalValue.startsWith("ENC(")) {
                return decrypt(originalValue);
            }
            return originalValue;
        }
    
        .
        .
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多