当前位置: 首页 > 知识库问答 >
问题:

覆盖bean的Spring Java配置

姚智
2023-03-14
@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注释创建的,另一个bean是在Spring配置类中声明的:

@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。

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

共有1个答案

司空海荣
2023-03-14

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

@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="getSomeDaoAnotherDataSource" name="someDaoAnotherDataSource"     class="SomeDaoImpl">
    <property name="dataSource" ref="otherDataSource" />
</bean>
 类似资料:
  • 我使用的是Spring4.3.x。 我看过很多相关的帖子,但没有一篇给我答案。如有任何帮助,我们将不胜感激。

  • 对于Spring Boot2.1,默认情况下禁用bean重写,这是一件好事。 然而,我确实有一些测试,其中我使用mockito用模拟实例替换bean。在默认设置下,使用这种配置的测试将由于bean重写而失败。 我发现唯一有效的方法是通过应用程序属性启用bean重写: 但是,我真的希望确保测试配置的bean定义设置最小,这一点将由spring在禁用重写的情况下指出。 我正在重写的bean是 在导入到

  • 在我的Spring应用程序中,我定义了类型的bean。 DefaultListableBeanFactory日志 信息10140---[main]o.s.b.f.s.DefaultListableBeanFactory:用不同的定义重写bean“Audit Listener”的bean定义:用[Root bean:class[demo.auditListener];scope=singleton;

  • 问题内容: 有没有一种简单的方法可以轻松地在特定的单元测试中覆盖自动装配的Bean?编译类中每种类型只有一个bean,因此在这种情况下自动装配不是问题。测试类将包含其他模拟。运行单元测试时,我只想指定一个基本的附加配置,运行该单元测试时,请使用此模拟而不是标准Bean。 概要文件似乎对我的需求有些矫kill过正,而且我不确定使用主要注解是否可以实现,因为不同的单元测试可能具有不同的模拟。 问题答案

  • 在Spring Hibernate XML配置中,我有 我知道SpringJava配置的等价物如下:LocalSessionFactoryBuilder(dataSource())。AddAnnotatedClass(Foo.class)。buildSessionFactory(); 我的问题是,如果我不使用LocalSessionFactoryBuilder类,而是使用HibernateJpaV

  • If set to true, variables read in from config files will overwrite each other. Otherwise, the variables will be pushed onto an array. This is helpful if you want to store arrays of data in config file