Spring:在新建应用程序上下文时,是否可以指定default-lazy-init值?

时间:2019-07-16 01:53:49

标签: java spring lazy-initialization

我正在从XML文件创建Spring应用程序上下文,如下所示:

this.applicationContext = new ClassPathXmlApplicationContext("classpath*:/spring-configuration/application-context.xml");

我知道有一个选项可以在XML文件本身中指定default-lazy-init,例如以下示例:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    ...
    default-lazy-init="true">
...
</beans>

但是,我想根据调用此代码时的上下文来决定是否使用默认的惰性初始化。有没有办法做到这一点?我基本上想要一个额外的配置布尔值,我可以将其传递给ClassPathXmlApplicationContext构造函数,该构造函数将告诉它是否使用默认的惰性初始化。

1 个答案:

答案 0 :(得分:0)

阅读Spring Docs On Lazy-initialized Beans

  

ApplicationContext在启动过程中急于创建单例bean。这个   实例化类型很好,因为配置中的错误是   一开始就发现。但是如果你   不想在一开始就对单例bean进行预先实例化,那么您可以将其标记为   bean定义为被延迟初始化。

注意:延迟初始化的单例bean仅在被请求时才实例化。

您可以通过两种方式实现bean的延迟初始化:

->在<bean>级别:

<bean id="demoBean" class="com.example.DemoBean" lazy-init="true"/>

->在容器级别(不会预先实例化任何bean):

<beans default-lazy-init="true">
 ...      
</beans>

因此,请根据需要选择一次。

要理解的示例:

DemoBean.java:

package com.example;
public class DemoBean {
    public DemoBean(){
        System.out.println("DemoBean is initialized on the request.");
    }
} 

Main.java:

public class Main {
    public static void main(String[] args) {
         ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("application-context.xml");
         context.getBean("demoBean");
    }
} 

输出:

DemoBean is initialized on the request.