java - 动态创建 spring bean 并更改现有 bean 的属性

标签 java spring

我通过遵循 http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ 成功地实现了数据库连接的动态更改文章。

但现在的问题是,我在由遗留应用程序管理的配置文件中有一个数据库 url 列表。

有没有一种方法可以根据值列表(即 Year2011DataSource、Year2012DataSource 等)在 Spring 上下文中创建 bean 并使用刚刚创建的那些 bean 填充 dataSource bean 的映射?

<!-- Property file located in the legacy application's folder -->
<context:property-placeholder location="file:///D:/config.properties" />

<!-- Shared data source properties are read from the config.properties file -->
<bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" abstract="true">
    <property name="driverClassName" value="${db.driver}" />
    <property name="username" value="${db.user}" />
    <property name="password" value="${db.password}" />
</bean>

<!-- Database urls by year -->
<bean id="Year2012DataSource" parent="parentDataSource">
    <property name="url" value="jdbc:sqlserver://localhost;databaseName=DbName_v570_2012" />
</bean>
<bean id="Year2011DataSource" parent="parentDataSource">
    <property name="url" value="jdbc:sqlserver://localhost;databaseName=DbName_v570_2011" />
</bean>
<bean id="Year2010DataSource" parent="parentDataSource">
    <property name="url" value="jdbc:sqlserver://localhost;databaseName=DbName_v570_2010" />
</bean>
<!-- ... and so on, these should instead be populated dynamically ... -->

<!-- DbConnectionRoutingDataSource extends AbstractRoutingDataSource -->
<bean id="dataSource" class="someProject.DbConnectionRoutingDataSource">
    <property name="targetDataSources">
        <map key-type="int">
            <entry key="2011" value-ref="Year2011DataSource" />
            <entry key="2010" value-ref="Year2010DataSource" />
            <!-- ... and so on, these also should instead be populated dynamically ... -->
        </map>
    </property>
    <property name="defaultTargetDataSource" ref="Year2012DataSource" />
</bean>

最佳答案

我认为非常适合这个要求的是自定义 BeanFactoryPostProcessor - 读取遗留配置并在自定义 bean 工厂后处理器中生成数据源:

class MyDatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        //Read in details from legacy properties.. build custom bean definitions and register with bean factory
        //for each legacy property...
            BeanDefinitionBuilder datasourceDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(BasicDataSource.class).addPropertyValue("url", "jdbc..");
            beanFactory.registerBeanDefinition(datasourceDefinitionBuilder.getBeanDefinition());
    }
}

关于java - 动态创建 spring bean 并更改现有 bean 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090406/

相关文章:

java - 无法为实现 Spring Security UserDetails 的类加载请求的类异常

java - Spring 休息: How to validate Date passed in request body

java - 如何在SPRING JPA查询结果中添加列名

mysql - SQL 错误 : 1452, SQL 状态:23000 |无法添加或更新子行:外键约束失败

java - JdbcTemplate 嵌套查询的问题

java - 向 ConstraintViolation 添加更多属性

java - android4.4设备恢复出厂设置后,系统app收不到BOOT_COMPLETED广播

java - 如何实现自定义身份验证?

java - 如何将 ResultSet 转换为 Object[] 并检索数据

java - 内存分布式缓存与内存数据网格