【问题标题】:How to inject a custom BeanFactory如何注入自定义 BeanFactory
【发布时间】:2017-04-28 11:27:08
【问题描述】:

对于自定义 Scope(由于法律原因,我无法在此处发布)我需要一个自定义 BeanFactory 来覆盖 getBean(Class requiredType) 方法,例如:

public class MyBeanFactory implements BeanFactory {

    @Override
    public <T> T getBean(Class<T> requiredType) throws BeansException {
        if(MyScope.someSetting) {
            return useBeanA();
        } else {
            return useBeanB();
        }
    }
}

这个BeanFactory 必须在我的整个弹簧容器中用于获取豆子(按类型)。如何将其注入ApplicationContext(或者我需要自定义ApplicationContext)?

我不能使用FactoryBean,因为逻辑对于一个(或几个)bean 来说并不特殊。我不能使用InstantiationAwareBeanPostProcessor,因为它的postProcessBeforeInstantiation() 方法只被调用一次。

【问题讨论】:

  • 这不是应该只在bean的范围内处理的吗?因此,如果您的问题确实是对所有 bean 应用范围而不是普通的单例范围,那么看看您是如何实现这一点的也许是一个更好的主意。您正在使用什么样的应用程序上下文,或者它是否需要成为通用解决方案?
  • 我的自定义范围仅适用于某些 bean,而不是全部。这就是为什么我需要对实例化/选择逻辑进行一些修改。我正在使用AnnotationConfigWebApplicationContex
  • 但是您的自定义范围不能在 MyBeanFactory.getBean 自己的 MyCustomScope.get(String, ObjectFactory&lt;?&gt;) 方法中实现您目前正在尝试实现的目标吗?
  • 谢谢。我现在明白了,你的意思。我会试试的...
  • 目前我只打电话给objectFactory.getObject(),不幸的是这是ObjectFactory的唯一方法。我可以将其转换为 BeanFactory 以获取其他 bean,但我不确定这是否是个好主意?

标签: java spring spring-ioc


【解决方案1】:

正如“spacetrucker”所建议的(请参阅问题的 cmets),我解决的问题完全不同。我将我的 bean 实例化/选择逻辑添加到我的自定义 Scope 中,并通过构造函数将 BeanFactory 注入到此 Scope 中。

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2013-11-11
    相关资源
    最近更新 更多