懒惰的init如何在春天工作?

时间:2013-10-23 12:27:55

标签: java spring spring-mvc

我是spring框架中的新手。我想要强制在创建特定对象时必须初始化其数据成员。所以最好的方法是用构造函数初始化它。

@Service
class GenerationServiceFactory{

@Autowired
private MyModel model;

public GenerationServiceFactory(MyModel obj){
model = obj;
}

}

但实际的模型对象是在运行时创建的。那么当spring创建所有bean时,我该如何传递该对象。我知道它与lazy init有关。但我不知道它是如何工作的。请帮帮我..谢谢:)。

3 个答案:

答案 0 :(得分:3)

使用延迟初始化时,Spring将根据需要创建对象。因此,如果A类依赖于B类,则在请求A类之前不会实例化B类。 Spring将导航依赖树并根据需要实例化

答案 1 :(得分:2)

如果从单例bean引用lazy-init bean,则将其创建为单例bean依赖关系图的一部分。你可以使用这样的动态代理来解决这个问题:

 <bean id="first" class="package.TestBean1">
     <property name="field" ref="second"/>
 </bean>

 <bean id="second" class="org.springframework.aop.framework.ProxyFactoryBean">
     <property name="targetSource">
          <bean class="org.springframework.aop.target.LazyInitTargetSource">
              <property name="targetBeanName" value="rawSecond"/>
          </bean>
     </property>
  </bean>

  <bean id="rawSecond" class="package.TestBean2" lazy-init="true">

此配置将延迟rawSecond实例化,直到进行第​​一次方法调用。

答案 2 :(得分:0)

当spring容器加载XML配置文件时,通常在spring框架中 所有豆子将立即启动。假设你的应用程序中出现了一种情况,你不希望一旦bean在容器中加载就会初始化一些bean,或者你希望它在运行时加载它,在这种情况下,你可以给出属性lazy-init = “真”。

您可以在此处查看示例example