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

发布于 2024-12-15 04:07:33 字数 434 浏览 0 评论 0原文

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

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

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

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

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

I am using spring mvc+hibernate+two databases

So for example:
I create 2 sessionFactories. sessionFactory1 (using datasource1) and sessionFactory2 (using datasource2).

Would it be possible to change sessionFactory1 or sessionFactory2 to sessionFactory at runtime so that the dao/s references them. sessionFactory is already autowired to all dao/s.

I am searching for it right now I think @Configuration can help me but I am not sure.

I am trying AbstractRoutingDataSource but don't think it helps.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

权谋诡计 2024-12-22 04:07:33

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

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

Usually Spring wires your beans on application startup, so "re-wiring" (replacing references to sessionFactory1 with references to sessionFactory2 on runtime) does not seem easy to implement.

Maybe you could implement a "proxy bean" that is wired to your DAO objects and change the "target SessionFactory" of your proxy bean.

空气里的味道 2024-12-22 04:07:33

AbstractRoutingDataSource 将为您工作。

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

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();
    }

}

您需要创建一个扩展该类并实现确定当前查找键()的类,并返回上下文持有者中的当前数据库:

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/
这对我来说效果很好。

AbstractRoutingDataSource will work for you.

First you'll need to create a class that will store the current DB in use:

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();
    }

}

You'll need to create a class that extends this one and implements determineCurrentLookupKey(), and return the current db you have in your context holder:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class MyRoutingDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return MyContextHolder.getDBContext();
    }
}

See the example in http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/.
It worked fine for me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文