0

我有两个疑问...

1)我有一个查询,当spring容器初始化时并且在调用get bean()方法之前,bean在spring容器本身中被初始化,这是默认行为,我怎样才能以这种方式配置应用程序只有当调用 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 现在是原型,当我访问单例时,其他引用 bean 的 zeropoint、firstpoint 和 secondpoint 也只针对三角形初始化一次,但在这里我希望每次这三个 bean 的新实例在获取三角形 bean 时创建,请告知如何实现。是否可以通过我的 pojo 实现 ApplicationContextAware 接口来实现,请告知

4

2 回答 2

3

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

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 查找方法注入

于 2012-07-11T19:03:43.930 回答
2
  1. 它被称为延迟加载

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

    • 首先请注意,您的firstpointsecondpointbean 没有有效的范围定义(您错过了scope=
    • 原型范围意味着每个需要原型 bean 的 bean 都有自己的实例。如果将定义多个三角形,它们都依赖于zeropoint每个三角形,则将是一个单独的zeropoint实例。
    • 如果你在你的三角形类中需要新的点实例(例如每次你调用一个三角形的方法),最好的方法是直接从bean工厂接收实例:

例如

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(..)
  }
}
于 2012-07-11T18:11:51.060 回答