默认情况下会在容器启动时初始化bean, 但是我们可以指定Bean节点的 lazy-init="true" 来延迟初始化bean,这时候,只有第一次获取bean才会初始化bean。在IoC容器的初始化过程中,主要的工作是对BeanDefinition的资源定位,载入,解析和注册。此时依赖注入并没有发生,依赖注入发生在应用第一次向容器所要Bean时。对于容器的初始化有另外一种情况,就是用户可以通过设置Bean的lazy-init属性来控制预实例化的过程,这个预实例化在容器初始化时就完成了依赖注入。
在refresh中调用的finishBeanFactoryInitialization(beanFactory)方法中封装了对lazy-init属性的处理,而实际的处理过程是在DefaultListableBeanFactory中
public void preInstantiateSingletons() throws BeansException {
if (this.logger.isInfoEnabled()) {
this.logger.info("Pre-instantiating singletons in " + this);
}
synchronized (this.beanDefinitionMap) {
for (String beanName : this.beanDefinitionNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
final FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName);
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
public Boolean run() {
return ((SmartFactoryBean) factory).isEagerInit();
}
}, getAccessControlContext());
}
else {
isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean) factory).isEagerInit();
}
if (isEagerInit) {
getBean(beanName);
}
}
else {
getBean(beanName);
}
}
}
}
}
注意这里调用了getBean(beanName),这个getBean()和上面分析的触发依赖注入的过程是一样的,只是发生的地方不同;如果不设置lazy-init属性,采用默认的lazy-init=default,即lazy-init=false,那么这个依赖注入是发生在容器初始化结束前.如果我们想对所有bean都应用延迟依赖注入,可以在根节点beans设置default-lazy-init="true"。
分享到:
相关推荐
在Spring框架中,有两个重要的参数default-lazy-init和lazy-init,它们都是用于控制Bean实例化的时机的。下面我们将详细介绍这两个参数的作用和区别。 一、default-lazy-init参数 default-lazy-init参数是Spring...
在Spring中配置一个bean为延迟实例化非常简单,只需要在`<bean>`元素中添加`lazy-init`属性并设置其值为`true`即可。例如: ```xml <bean id="lazyBean" class="com.example.LazyBean" lazy-init="true"> <!-- ...
首先,`spring-beans-3.0.xsd`是Spring 3.0版本中的beans配置文件,它定义了一系列元素和属性,允许开发者声明、配置和管理bean。例如,`<bean>`元素是配置中最基础的部分,用于定义一个bean实例,包括其类名、初始...
可以使用<bean lazy-init=""/>延缓实例化 可以使用<beans default-lazy-init=""/>延缓所有组件实例化 b.销毁时机:单例对象容器close()负责销毁 c.创建对象的模式(使用范围):scope控制,可以使用singleton和...
可以使用<bean lazy-init=""/>延缓实例化 可以使用<beans default-lazy-init=""/>延缓所有组件实例化 b.销毁时机:单例对象容器close()负责销毁 c.创建对象的模式(使用范围):scope控制,可以使用singleton和...
可以使用<bean lazy-init=""/>延缓实例化 可以使用<beans default-lazy-init=""/>延缓所有组件实例化 b.销毁时机:单例对象容器close()负责销毁 c.创建对象的模式(使用范围):scope控制,可以使用singleton和...
### Spring Bean 属性详解 Spring框架是Java平台上的一个开源框架,主要用来简化企业级应用程序的开发。...通过深入了解这些元素和属性,开发人员可以更有效地利用Spring框架的功能,构建更加健壮和可扩展的应用程序。
- **Lazy Initialization**:通过lazy-init属性,可以控制Bean是否延迟初始化,提高系统启动效率。 - **Auto-wiring**:自动装配功能,可以根据类型或名称自动查找并注入依赖。 在实际开发中,理解Spring-3.0.xsd...
懒惰初始化可以使用 lazy-init 属性来设置对象“懒惰”初始化,bean 对象在容器启动时候不会初始化,在第一次使用时候才初始化。 在 Spring 框架中,工厂方法是一种封装了复杂的对象创建过程,提供一个简单方法作为...
在实例化完成后,Spring 框架会对 Bean 对象进行属性赋值。在这个阶段,Spring 框架会将依赖关系图中的依赖对象注入到 Bean 对象中。例如,如果 Bean 对象依赖于另一个 Bean 对象,Spring 框架会将该 Bean 对象注入...
- Spring管理的bean有完整的生命周期,包括实例化、初始化、配置、使用和销毁。 - 可以通过实现InitializingBean、DisposableBean接口或使用@PostConstruct、@PreDestroy注解来干预生命周期方法。 - 通过Bean...
它解析`<bean>`标签,从中提取出`class`属性(定义bean的实现类)、`parent`属性(定义父bean)、以及其他的属性,如`scope`(作用域)、`abstract`(是否为抽象bean)、`lazy-init`(是否延迟初始化)、`autowire`...
2. `lazy-init`属性允许延迟初始化Bean,`refresh()`方法后,`finishBeanFactoryInitialization()`处理预实例化的Bean。 3. `FactoryBean`允许自定义Bean的创建逻辑,`AbstractBeanFactory`在获取Bean时会检查是否是...
1. **对象的创建**:BeanFactory能够根据配置信息创建bean实例,支持延迟加载(lazy-init),只有在真正需要时才会实例化bean。 2. **依赖注入**:BeanFactory可以根据bean之间的依赖关系,自动装配bean的属性,无需...
* lazy-init为“default/false”当启动spring容器的时候创建bean 但是如果该bean是prototype时,特殊。这种情况无效 * 在spring容器启动的时候,就会发现错误 * 有可能会造成一些数据长时间驻留在内存中 * lazy...
当启用了 lazy-init 属性时,Spring IoC 容器不会在初始化时实例化 Bean,而是等到调用 Bean 时才会去创建 Bean。这可以减少系统的资源占用和提高系统的性能。 定义 Bean public class Animals { public Animals...
lazy-init 可以用来延迟 Bean 的实例化,直到第一次使用该 Bean 时。这样可以提高应用程序的启动速度。 6. 使用 lookup-method 来注入 Bean lookup-method 可以用来注入 Bean,避免了硬编码的依赖关系。 7. 使用 ...
Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...
- **1.4.4 惰性初始化Bean**: 通过设置`lazy-init`属性为`true`,可以让Spring容器延迟创建Bean,直到第一次调用时才实例化。 - **1.4.5 自动装配协作对象**: Spring支持自动装配协作对象,减少显式配置的需求。 -...