2011-11-16 171 views
0

我一直在玩和春天有一个快速的问题...实例化春bean对象

我有内class A该实例的class B新对象循环。为此,我使用了new运算符,但我无法引用注入到class B实例中的任何Spring bean,因为我得到了空指针异常。我想我明白这是因为spring没有将这些实例作为bean进行管理,因此无法管理生命周期,但是我只是想知道创建多个实例的最佳方式是什么,也就是说我应该使用appContext.getBean("beanA");

回答

2

首先 - 对你的假设是正确的。使用new意味着弹簧不管理对象。

解决方案可以是:

  • appContext.getBean("beanA"),其中bean是范围 “原型”。您通过注入appContext或通过实施ApplicationContextAware
  • 使用@Configurable和apsectJ编织获得appContext。这样,即使使用new实例化的对象也会被弹簧管理(编织器插入编译器或虚拟机)
  • 使用lookup-method - 与第一个选项相同(同样需要原型范围的bean),但是您会得到一个方法你每次调用它时返回一个新实例的类。

但是,通常情况下,您不应该那样做。在少数情况下,我会推荐第三个选项。

+0

不错的总结,第三个选项确实很容易。 –

+0

@Bozho感谢您的回答,但请您澄清为什么我不应该需要在正常情况下这样做?再次感谢 – JLove

+1

,因为通常所有的bean都是不包含状态的单例。这当然是贫血数据模型的症状,但这就是常规应用程序的结构。如果您需要您的业务对象执行逻辑并拥有状态,请阅读有关领域驱动的设计 – Bozho