gpt4 book ai didi

java - Spring FactoryBean 的使用

转载 作者:行者123 更新时间:2023-12-01 23:50:06 25 4
gpt4 key购买 nike

我有一个应用程序,我希望能够根据属性文件中的值切换 DAO 实现。 Spring FactoryBean 接口(interface)看起来工作得很好,因为我可以通过 FactoryBean 提供 DAO,在其中我可以根据属性值进行切换工作。

this最后一段然而,springsource 博客文章提到了这个警告:

One important takeaway here is that it is the FactoryBean, not the factoried object itself, that lives in the Spring container and enjoys the lifecycle hooks and container services. The returned instance is transient - Spring knows nothing about what you've returned from getObject() , and will make no attempt to exercise any lifecycle hooks or anything else on it.

我的 DAO 对象包含 Spring 注释 @Repository@Transactional。根据上面的段落,如果我通过 FactoryBean 返回 DAO 实现,这些注释是否会被忽略?如果是这样,确保 Spring 管理 FactoryBean 返回的 bean 的好方法是什么?

编辑:似乎大多数人都在为该问题提供替代配置解决方案。虽然我对这些建议持开放态度(如果它们很好,我会投票赞成),但我的问题实际上与正确的 FactoryBean 使用有关,我将根据这些问题标记正确的答案。

最佳答案

假设你有这样的东西:

public interface FooDao {
// ...
}

@Repository("firstFooDao")
public class FirstFooDao implements FooDao {
//...
}

@Repository("secondFooDao")
public class SecondFooDao implements FooDao {
//...
}

您可以创建一个配置类来根据占位符返回适当的实现(在此示例中为 foo):

@Configuration
public class FooDaoConfiguration {

@Value("${foo}")
private String foo;

@Autowired
private BeanFactory beanFactory;

@Bean
@Primary
public FooDao fooDao() {
return beanFactory.getBean(foo, FooDao.class);
}

}

然后您可以在属性文件中切换实现:

#foo=firstFooDao
foo=secondFooDao
这样,您的两个实现都由 spring 管理 - 它与您链接的文档中的示例不同,其中返回的对象是使用非 spring 工厂构造的。在这种情况下,所有 bean 都由 spring 实例化。配置类选择其一。

关于java - Spring FactoryBean 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16427393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com