Spring Bean延迟实例化是什么意思

问题描述

最近回顾知识,看到Spring Bean延迟实例化这个概念,发现有点不甚理解,还请高手们指教一番,谢谢!

解决方案

如果看控制台输出,你会发现在启动时候spring输出很多信息,其中就有初始化BEAN。延迟初始化就是不在这时候初始化。在你第一次使用的时候才创建然后交给spring管理。
解决方案二:
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天)。有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。例如:<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"> <!-- various properties here... --></bean> <bean name="not.lazy" class="com.foo.AnotherBean"> <!-- various properties here... --></bean>当ApplicationContext实现加载上述配置时,设置为lazy的bean将不会在ApplicationContext启动时提前被实例化,而not.lazy却会被提前实例化。需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。在容器层次中通过在<beans/>元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置:<beans default-lazy-init="true"> <!-- no beans will be eagerly pre-instantiated... --></beans>
解决方案三:
spring初始化的时候只会实例化单例与非延迟加载(lazy-init="true")的对象。其他的对象是在调用getBean的时候进行实例化。
解决方案四:
spring的bean在ioc容器初始化的时候默认是不实例化的哦~而是在第一次真正使用的时候才会初始化

时间: 2024-09-17 03:50:25

Spring Bean延迟实例化是什么意思的相关文章

Spring Bean的作用域(转)

  Spring Bean的作用域 .singleton  [单例] eg:<bean id="personService" class="com.yinger.service.impl.PersonServiceBean" scope="singleton"></bean> 在每个Spring IoC容器中一个bean定义只有一个对象实例. 请注意Spring的singleton bean概念与"四人帮&quo

spring bean加载--从缓存中获取bean

标签:spring源码学习 入口方法:getSingleton,在 Object sharedInstance = getSingleton(beanName); @Override public Object getSingleton(String beanName) { return getSingleton(beanName, true); } 真正的实现: protected Object getSingleton(String beanName, boolean allowEarlyR

Spring bean的配置

Bean的容器 Factory和Context,Context多了运行时上下文,提供读取资源文件,监听等等能力 Bean的生命周期: 实例化->填充属性->BeanNameAware的setBeanName方法, 调用BeanFactoryAware的setBeanFactory()方法,调用ApplicationContextAware的setApplicationContext()方法-->调用BeanPostProcessore的预初始化方法,调用InitializingBean的

Spring Bean基本管理实例详解_java

本文实例讲述了Spring Bean基本管理.分享给大家供大家参考,具体如下: 一.使用setter方式完成依赖注入 下面是Bean和beans-config.xml文件. public class HelloBean { private String helloWord; //...省略getter.setter方法 } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC &

Spring Bean的生命周期详细介绍_java

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 一.生命周期流程图: Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关

spring bean 属性从配置文件读取

问题描述 spring bean 属性从配置文件读取 我在spring的xml文件中使用这个标签: <context:component-scan base-package="${serverPack}"/> 启动${serverPack}从配置文件中获取,现在启动Tomcat出错. 解决方案 Spring bean配置读取配置文件Spring中读取bean配置文件的几种方式用dom4j读取配置文件来模拟spring的bean工厂 解决方案二: 要读取.properties

Spring Bean的生命周期管理

本文来自阅读Life Cycle Management of a Spring Bean这篇文章所做的笔记和实验. 按图索骥 bean的生命周期 知识点 1. BeanNameAware接口 Spring Bean存活于容器之中,一般情况下spring bean对context的情况并不了解,如果希望某个bean知道自己在context中的代号:bean name,即可让该bean的类型实现BeanNameAware接口. package org.test.spittr.spi; import

Spring Bean注册方式小结

IOC容器 Spring的核心是一个IOC容器,管理着我们向容器注册的所有bean.下面我们来看下两种向容器注册bean的方式, 通过BeanDefinitionReader读取Spring Bean的配置文件,解析然后注册: 通过ClassPathBeanDefinitionScanner直接扫描带有Spring Bean注解的Java类并注册: Reader BeanDefinitionReader的使用方式如下, import org.springframework.beans.facto

spring-大家帮忙看看Spring bean加载抽象类的奇怪现象

问题描述 大家帮忙看看Spring bean加载抽象类的奇怪现象 是这样的,抽象类B实现接口A,实现类C继承B:在D service里面的bean C调用不到A的接口方法 伪代码如下 interface A{ void exec() } public abstract B implements A{ void exec(){ //do something } } @Named("c") public C extends B{ void other(){ } } @Named publi