59

我是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。在这里纠正我,如果我的解释是错误的。

惰性初始化的默认行为到底是什么?它将如何实例化?

4

5 回答 5

74

默认行为是假的:

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

我建议阅读

于 2013-02-26T15:30:15.693 回答
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;

    .......
 }
于 2016-02-02T05:21:14.823 回答
22

bean上的lazy-init="default"设置仅指封闭beans元素的属性设置的内容。的隐含默认值为。default-lazy-initdefault-lazy-initfalse

如果 bean 上没有lazy-init指定属性,它总是被急切地实例化。

于 2013-02-26T15:29:38.947 回答
3

lazy-init 是 bean 的属性。lazy-init 的值可以是 true 和 false。如果lazy-init 为true,那么当对bean 发出请求时,该bean 将被初始化。这个bean在spring容器初始化的时候不会被初始化, 如果lazy-init为false那么bean会在spring容器初始化的时候被初始化。

于 2015-08-19T08:49:51.307 回答
2

当我们在 element 中使用lazy-init="default"作为属性时,容器会获取元素的default-lazy-init="true|false"属性指定的值,并将其用作lazy-init="true|false ”。

如果元素中不存在 default-lazy-init 属性,则元素中的lazy-init="default" 将表现得如同lazy-init-"false"。

于 2016-07-13T13:31:07.117 回答