lazy-init的Spring默认行为

时间:2013-02-26 15:26:59

标签: spring spring-ioc

我是春天的初学者,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的默认行为究竟是什么?它将如何实例化?

5 个答案:

答案 0 :(得分:62)

默认行为为false:

  

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

I suggest reading up

答案 1 :(得分:22)

对于那些来到这里并使用Java配置的人,您可以使用以下注释将Bean设置为lazy-init:

在配置类中:

@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;

    .......
 }

答案 2 :(得分:21)

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

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

答案 3 :(得分:3)

lazy-init是bean的属性。 lazy-init的值可以是true和false。 如果lazy-init为true ,则在向bean发出请求时将初始化该bean。初始化spring容器时,不会初始化此bean 和 如果lazy-init为false ,则将使用spring容器初始化初始化bean。

答案 4 :(得分:1)

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

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