【问题标题】:Get JNDI resources programatically in spring在春季以编程方式获取 JNDI 资源
【发布时间】:2014-06-02 21:30:19
【问题描述】:

我有一个 Tomcat servlet 容器,其中包含由 Tomcat 的连接池管理的 DataSources 列表。从我的 Spring 应用程序(Spring 3.2.3)中,我想在运行时获取这些数据源之一,例如:

public class MyService {
    @Autowired 
    private JndiObjectLocator jndiLocator;

    public void myMethod(String jndiName) {
        DataSource myDataSource = jndiLocator.locate(jndiName);
    }
}

关于如何做到这一点的任何想法?

【问题讨论】:

  • 为什么需要运行时查找,为什么在配置中不能这样做?
  • 问题出在哪里?
  • @M.Deinum 因为我将拥有大约 20 个数据源(最初的糟糕设计),我不想 @Autowire 20 个资源并做 20 个切换案例。数据源的数量也会增加(可能每年一次)
  • @Stefoan 问题是:如何在 Spring 中做到这一点?
  • 为什么不能在 spring 配置中定义所有这些并使用对BeanFactory(或ApplicationContext)的引用来进行查找?不需要 switch/if-then-else 结构。此外,如果这 20 个数据源与多租户支持有关,您可能希望拥有一个 look at this,这将使其对您的应用程序完全透明。

标签: java spring tomcat jndi


【解决方案1】:

您始终可以在代码中进行 JNDI 查找,您可以为此使用 JndiDataSourceLookup 并调用 getDataSource() 方法。

public class MyService {
    @Autowired 
    private JndiDataSourceLookup lookup;

    public void myMethod(String jndiName) {
        DataSource myDataSource = lookup.getDataSourcejndiName);
    }
}

另一种选择是让您的 bean 知道 BeanFactory 并从那里检索 DataSource

public class MyService {
    @Autowired 
    private BeanFactory factory;

    public void myMethod(String jndiName) {
        DataSource myDataSource = factory.getBean(jndiName, DataSource.class);
    }
}

【讨论】:

  • JndiDataSourceLookup 正是我一直在寻找的,而且效果很好。
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 2014-07-21
相关资源
最近更新 更多