在spring运行时更改bean属性/值



我正在使用spring mvc+hibernate+两个数据库

例如:我创建了2个sessionFactories。sessionFactory1(使用datasource1)和sessionFactory2(使用datasource2).

是否可以在运行时将sessionFactory1sessionFactory2更改为sessionFactory,以便dao/s引用它们?sessionFactory已经自动连接到所有dao/s。

我现在正在寻找它,我想@Configuration可以帮助我,但我不确定。

我正在尝试AbstractRoutingDataSource,但不认为它有帮助。

通常Spring在应用程序启动时连接bean,因此"重新连接"(在运行时将对sessionFactory1的引用替换为对sessionFactory2的引用)似乎不容易实现。

也许您可以实现一个连接到DAO对象的"代理bean",并更改代理bean的"target SessionFactory"。

AbstractRoutingDataSource将为您工作。

首先,您需要创建一个类来存储当前使用的DB:

public class MyContextHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
    public static void setDBContext(String dBContext) {
        contextHolder.set(dBContext);
    }
    public static String getDBContext() {
        return (String) contextHolder.get();
    }
    public static void clearDBContext() {
        contextHolder.remove();
    }
}

你需要创建一个类来扩展这个类,并实现determineCurrentLookupKey(),并返回你在上下文holder中的当前db:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class MyRoutingDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return MyContextHolder.getDBContext();
    }
}

参见http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/中的示例。

最新更新