首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @Bean参数

Spring @Bean参数
EN

Stack Overflow用户
提问于 2013-12-17 09:45:01
回答 1查看 5.8K关注 0票数 2

我刚刚更新了Spring3.1.1到3.2.6

使用3.1时,以下代码运行良好:

代码语言:javascript
复制
@Bean(name = DEMO_DS)
public JndiObjectFactoryBean demoDataSource()
{
    JndiObjectFactoryBean factory = new JndiObjectFactoryBean();
    factory.setJndiName(JDBC_DEMO_DS);
    factory.setProxyInterface(DataSource.class);
    return factory;
}

@Bean(name = DEMO_SESSION_FACTORY)
public SqlSessionFactoryBean demoSqlSessionFactory(@Qualifier(DEMO_DS) DataSource dataSource)
{
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml"));

    return sessionFactory;
}

然而,对于高级版本,我得到了以下例外:

由: org.springframework.beans.factory.NoSuchBeanDefinitionException:所致,没有javax.sql.DataSource类型的限定bean :期望至少有一个bean,它可以作为此依赖项的自动选择。依赖性注释:{@org.springframework.beans.factory.annotation.Qualifier(value=DemoDataSource)}

我有多个DataSources,因此@限定符是必需的。

谢谢。

编辑:

这似乎解决了这个问题:

代码语言:javascript
复制
public DataSource dataSourceFactory() {
    try
    {
        return (DataSource) demoDataSource().getObject();
    }
    catch (Exception ex)
    {
        throw new RuntimeException(ex);
    }
}

...

sessionFactory.setDataSource(dataSourceFactory());

不过,我不认为这是个好办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-17 11:22:01

根据您的需要,稍微重写一下您的配置。如果你真的不需要注入数据源,你可以这样做。

代码语言:javascript
复制
@Bean(name = DEMO_DS)
public JndiObjectFactoryBean demoDataSource() {
    JndiObjectFactoryBean factory = new JndiObjectFactoryBean();
    factory.setJndiName(JDBC_DEMO_DS);
    factory.setProxyInterface(DataSource.class);
    return factory;
}

@Bean(name = DEMO_SESSION_FACTORY)
public SqlSessionFactoryBean demoSqlSessionFactory() {
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(demoDataSource().getObject());
    sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml"));
    return sessionFactory;
}

如果需要注入数据源,则可能需要切换到使用JndiLocatorDelegate来进行查找,而不是使用JndiObjectFactoryBean

代码语言:javascript
复制
@Bean(name = DEMO_DS)
public DataSource demoDataSource() throws NamingException {
    return JndiLocatorDelegate.createDefaultResourceRefLocator().lookup(JDBC_DEMO_DS, DataSource.class);
}

这直接给您提供了一个DataSource,而不是FactoryBean<Object> ( JndiObjctFactoryBean是什么),问题的根源可能是什么。

或者(理论上)您还应该能够对配置类中的属性使用@Value注释。与@Value不同,普通的@Resource也应该完成这个任务(也可以将调用委托给JNDI进行查找)。

代码语言:javascript
复制
public class MyConfig {

    @Value("${" + JDBC_DEMO_DS + "}")
    private DataSource demoDs;

}

@Resource

代码语言:javascript
复制
public class MyConfig {

    @Resource(mappedName=JDBC_DEMO_DS)
    private DataSource demoDs;

}

然后,您可以简单地在配置方法中引用它。

代码语言:javascript
复制
@Bean(name = DEMO_SESSION_FACTORY)
public SqlSessionFactoryBean demoSqlSessionFactory() {
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(demoDs);
    sessionFactory.setConfigLocation(new ClassPathResource("demo/config.xml"));
    return sessionFactory;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20630742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档