【问题标题】:Spring Java Configuration Overriding BeansSpring Java 配置覆盖 Bean
【发布时间】:2013-09-06 10:37:52
【问题描述】:

我在创建两个相同类但限定符名称不同的 bean 时遇到问题。基本上,一个 bean 是使用 @Repository 注释创建的,另一个是在 @Configuration 类中创建的。

这是我们不会使用不同数据源的两个实例的类:

@Repository ("someDao")
public class SomeDaoImpl implements SomeDao {

    private NamedParameterJdbcTemplate jdbcTemplate;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }
}

然后我们有这样的服务:

@Service
public class SomeServiceImpl implements
        SomeService {

    @Resource(name = "someDao")
    private SomeDao someDao;

    @Resource(name = "someDaoAnotherDataSource")
    private SomeDao someDaoAnotherDataSource;

}

我的第一个 bean 是由注释 @Repository 创建的,另一个是我在 Spring Configuration 类中声明的:

@Configuration
@ComponentScan(basePackages = "mypackages")
public abstract class ApplicationRootConfiguration {

    @Bean(name = "otherDataSource")
    public DataSource otherDataSource() throws NamingException {
    ...
    }

    @Bean(name = "someDaoAnotherDataSource")
    public SomeDao getSomeDaoAnotherDataSource(@Qualifier("otherDataSource")
     DataSource dataSource) throws NamingException {
        SomeDao dao = new SomeDaoImpl();
        dao.setDataSource(dataSource);
        return dao;
    }
}

如果我运行我的应用程序,SomeServiceImpl 中的属性 someDaoAnotherDataSource 没有在配置类中声明我的 bean,它使用注释存储库声明了 bean。

另外,如果我在 XML 配置中运行相同的示例,它可以工作:

<bean id="someDaoAnotherDataSource"     class="SomeDaoImpl">
    <property name="dataSource" ref="otherDataSource" />
</bean>

知道为什么不自动装配正确的 bean 吗?

提前致谢。

【问题讨论】:

  • 这对我有用。你确定名字是正确的吗?
  • 是的,它似乎必须工作,因为它几乎相同,但没有。你用的是什么春季版本?我正在使用 3.2.4.RELEASE。
  • 对我来说也一样。把它分解成最简单的形式,然后再试一次。
  • 你能发布你的完整配置吗?或者至少是模仿它的东西?您发布的 xml sn-p 以与 @Configuration 注释 bean 相同的方式(和某些上下文)加载?

标签: java spring ioc-container


【解决方案1】:

只是一个想法,而不是将数据源注入方法尝试以下

@Bean(name = "someDaoAnotherDataSource")
public SomeDao getSomeDaoAnotherDataSource() throws NamingException {
    SomeDao dao = new SomeDaoImpl();
    dao.setDataSource(otherDataSource());
    return dao;
}

虽然两者都应该工作。

确保您的 @Resource 注释中的名称正确,而不是(或旁边)在 @Bean 注释中指定 bean 的名称,而是将您的方法重命名为相同的名称。

@Bean(name = "someDaoAnotherDataSource")
public SomeDao someDaoAnotherDataSource() throws NamingException {
    SomeDao dao = new SomeDaoImpl();
    dao.setDataSource(otherDataSource());
    return dao;
}

名称基本上是一个别名,而方法名称用作 bean 的 id。可能是解析没有正确查看别名。 xml中的相同是

<bean id="getSomeDaoAnotherDataSource" name="someDaoAnotherDataSource"     class="SomeDaoImpl">
    <property name="dataSource" ref="otherDataSource" />
</bean>

【讨论】:

  • 谢谢,但无论是放置方法声明还是使用限定符自动装配都不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多