Spring惰性初始化的默认行为

问题描述 投票:0回答:5

我是 spring 初学者,ESP 控制反转。我很困惑理解以下之间的区别

 <bean id="demo" class="Demo" lazy-init="false"/>
 <bean id="demo" class="Demo" lazy-init="true"/>
 <bean id="demo" class="Demo" lazy-init="default"/>

据我了解:lazy-init=false 在启动时创建 bean,lazy-init=true 不会在启动时创建 bean,而是根据特定 bean 的请求创建 bean。 如果我的解释有误,请纠正我。

lazy-init 的默认行为到底是什么?它会如何实例化?

spring lazy-initialization spring-ioc
5个回答
74
投票

默认行为为 false:

默认情况下,ApplicationContext 实现会急切地创建和 将所有单例 bean 配置为初始化过程的一部分。 一般来说,这种预实例化是可取的,因为错误在 立即发现配置或周围环境, 而不是几个小时甚至几天后。当这种行为不 如果需要,您可以通过以下方式防止单例 bean 的预实例化 将 bean 定义标记为延迟初始化。惰性初始化 bean 告诉 IoC 容器创建一个 bean 实例 第一次请求,而不是在启动时。

我建议阅读


26
投票

对于那些来到这里并使用 Java 配置的人,您可以使用如下注释将 Bean 设置为惰性初始化:

配置类中:

@Configuration
// @Lazy - For all Beans to load lazily
public class AppConf {

    @Bean
    @Lazy
    public Demo demo() {
        return new Demo();
    }
}

用于元件扫描和自动接线:

@Component
@Lazy
public class Demo {
    ....
    ....
}

@Component
public class B {

    @Autowired
    @Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request.
    private Demo demo;

    .......
 }

22
投票

bean

 上的 
lazy-init="default" 设置仅指由封闭的 beans
 元素的 
default-lazy-init 属性设置的内容。 default-lazy-init
 的隐式默认值为 
false

如果没有在 bean 上指定

lazy-init

 属性,它总是会立即实例化。


3
投票
lazy-init是bean的属性。 lazy-init 的值可以是 true 和 false。

如果lazy-init为true,那么当向bean发出请求时,该bean将被初始化。 spring容器初始化时,这个bean不会被初始化 和 如果lazy-init为false那么bean将通过spring容器初始化来初始化。


2
投票
当我们使用

lazy-init="default" 作为 element 中的属性时,容器会选取 element 的 default-lazy-init="true|false" 属性指定的值并将其用作lazy-init =“真|假”。

如果元素中不存在default-lazy-init属性,则元素中的lazy-init =“default”将表现为lazy-init-“false”。

© www.soinside.com 2019 - 2024. All rights reserved.