1

我在创建两个相同类但限定符名称不同的 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吗?

提前致谢。

4

1 回答 1

0

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

@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>
于 2013-09-06T10:57:05.030 回答