【问题标题】:Spring: Is it possible to specify the default-lazy-init value when you're new-ing the application context?Spring:是否可以在新建应用程序上下文时指定 default-lazy-init 值?
【发布时间】:2019-11-24 17:00:23
【问题描述】:

我正在从 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 构造函数,它会告诉它是否使用默认的惰性初始化。

【问题讨论】:

  • 你不能向上下文的构造函数传递任何额外的东西,因为它不允许额外的参数。有几种方法可以即时更改 bean 定义,但无论如何你可以在开始时只做一次。为什么调用代码后需要做决定?

标签: java spring lazy-initialization


【解决方案1】:

阅读Spring Docs On Lazy-initialized Beans

ApplicationContext 在启动期间急切地创建单例 bean。这 实例化类型很好,因为配置中的错误是 一开始就发现。但是如果你 不想在一开始就预实例化一个单例bean,那么你可以标记它 bean 定义为惰性初始化。

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

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

-> 在&lt;bean&gt; 级别:

<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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2014-02-21
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多