每次都获取引用bean的新bean实例

时间:2012-07-11 17:20:00

标签: spring

我有两个问题......

1)我有一个查询,当spring容器是intialiazed时,在spring容器本身初始化bean,并且在调用get bean()方法之前,这是默认行为,我该如何配置应用程序以这种方式,只有在调用getbean()时才应该在容器中初始化bean,我们应该将bean声明为原型来实现这一点。

2)第二个问题是首先请先通过以下示例...

 <beans>
<bean id="triangle"  class="Demo.Triangle" scope="singleton" >
<property  name="pointA" ref="zeropoint"/>
<property  name="pointB" ref="firstpoint"/>
<property  name="pointC" ref="secondpoint"/>
</bean>

<bean id="zeropoint"  class="Demo.Point"  scope="prototype" >
<property name="x" value="10" /> 
<property name="y" value="20" /> 
</bean>


<bean id="firstpoint"  class="Demo.Point"  scope="prototype" >
<property name="x" value="10" /> 
<property name="y" value="20" /> 
</bean>

<bean id="secondpoint"  class="Demo.Point" scope="prototype">
<property name="x" value="10" /> 
<property name="y" value="20" /> 
</bean>

如上所示,三角形bean是单例,它引用bean是protoype现在当我访问singleton时其他引用bean zeropoint,firstpoint和secondpoint也只相对于三角形初始化一次但是这里我希望每次都是新的实例获取三角形bean时要创建这三个bean,请告知如何实现。是通过我的pojo实现ApplicationContextAware接口可以实现的,请指教

2 个答案:

答案 0 :(得分:3)

我建议尝试查找方法功能,而不是依赖Spring基础架构(BeanFactoryAware):

abstract class Triangle {

    public abstract Point createZeroPoint();
    public abstract Point createFirstPoint();
    public abstract Point createSecondPoint();

    public void foo() {
        Point p0 = createZeroPoint();
        Point p1 = createFirstPoint();
        Point p2 = createSecondPoint();
    }

}

每次调用create*Point()抽象方法时,它都会创建Point的新实例。但是如何实现此方法以及它如何知道返回哪个bean? Spring为您实现了这一点!

<bean id="triangle" class="Demo.Triangle" scope="singleton">
    <lookup-method name="createZeroPoint" bean="zeropoint"/>
    <lookup-method name="createFirstPoint" bean="firstpoint"/>
    <lookup-method name="createSecondPoint" bean="secondpoint"/>
</bean>

查看综合文档:4.4.6.1 Lookup method injection

答案 1 :(得分:2)

  1. 名为Lazy loading

    <bean id="myBean" class="a.b.MyBean" lazy-init="true"/>

    • 首先请注意,您的firstpointsecondpoint bean没有有效的范围定义(您错过了scope=
    • 原型范围意味着需要原型bean的每个bean都有自己的实例。如果要定义多个三角形,这些三角形都与zeropoint相关,则每个三角形都会有一个单独的zeropoint实例。
    • 如果在三角形类中需要新的点实例(例如,每次调用三角形方法),最好的方法是直接从bean工厂接收实例:
  2. E.g。

    class MyClass implements BeanFactoryAware {
    
      private BeanFactory beanFactory;
    
      public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
      }
    
      public void doSomethingThatRequiresNewInstance() {
        Triangle t = beanFactory.getBean("zeropoint", Triangle.class);
        // because zeropoint is defined as prototype you get a new instance everytime you call getBean(..)
      }
    }