lazy-init的Spring默认行为

srk*_*srk 55 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"/>
Run Code Online (Sandbox Code Playgroud)

据我所知:lazy-init = false在启动时创建bean,而lazy-init = true在启动时不创建bean,而是在请求特定bean时创建bean.在这里纠正我,如果我的解释是错误的.

究竟什么是lazy-init的默认行为?它将如何实例化?

Vje*_*tje 65

默认行为为false:

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

我建议读一读


Dav*_*idR 24

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

在配置类中:

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

    @Bean
    @Lazy
    public Demo demo() {
        return new Demo();
    }
}
Run Code Online (Sandbox Code Playgroud)

对于组件扫描和自动布线:

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

    .......
 }
Run Code Online (Sandbox Code Playgroud)


zag*_*gyi 21

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

如果lazy-initbean上没有指定属性,则总是急切地实例化它.