本文收集整理关于spring的生命周期是多少的相关议题,使用内容导航快速到达。
内容导航:
Q1:spring生成bean对象的生命周期有哪些种类?
Spring 中bean 的生命周期短暂吗?
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题。
然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例:例如:
在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例
一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段(如图1.1): 1:Bean的建立:
容器寻找Bean的定义信息并将其实例化。
2:属性注入:
使用依赖注入,Spring按照Bean定义信息配置Bean所有属性
3:BeanNameAware的setBeanName():
如果Bean类有实现org.springframework.beans.BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。
4:BeanFactoryAware的setBeanFactory():
如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
5:BeanPostProcessors的ProcessBeforeInitialization()
如果有org.springframework.beans.factory.config.BeanPostProcessors和Bean关联,那么其postProcessBeforeInitialization()方法将被将被调用。
6:initializingBean的afterPropertiesSet():
如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法
7:Bean定义文件中定义init-method:
可以在Bean定义文件中使用"init-method"属性设定方法名称例如:
如果有以上设置的话,则执行到这个阶段,就会执行initBean()方法
8:BeanPostProcessors的ProcessaAfterInitialization()
如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法
此时,Bean已经可以被应用系统使用,并且将保留在BeanFactory中知道它不在被使用。有两种方法可以将其从BeanFactory中删除掉(如图1.2): 1:DisposableBean的destroy()
在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法
2:Bean定义文件中定义destroy-method
在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称,例如:
如果有以上设定的话,则进行至这个阶段时,就会执行destroy()方法,如果是使用ApplicationContext来生成并管理Bean的话则稍有不同,使用ApplicationContext来生成及管理Bean实例的话,在执行BeanFactoryAware的setBeanFactory()阶段后,若Bean类上有实现org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,接着才执行BeanPostProcessors的ProcessBeforeInitialization()及之后的流程。
Q2:spring中bean的生命周期是怎么样的
1.Spring对Bean进行实例化(相当于程序中的new Xx())。
2.Spring将值和Bean的引用注入进Bean对应的属性中
3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法。
(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)。
4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。
(实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)。
在spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype),Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean.
当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。
Q3:Spring如何去管理对象的生命周期呢?
默认情况下为singleton,bean的scope属性可做设置,singleton或prototype为两个可选值,一般来说,只要容器启动后,你的jvm不down,所有的singleton对象实例均存在在其对应的容器中,prototype类型的与你在程序里进行的new操作一致,也就是说,你getBean一次,相当于new一个新对象。
Q4:谁能介绍一下 spring框架的bean生命周期
在spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype),Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean.
当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当于一个new的操作.
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,global session为整个HTTP请求中,在作用域方面就是application
Q5:spring bean的生命周期是怎样的,代码示例
Spring中bean的生命周期管理可以在xml配置文件(一般叫bean.xml或ApplicationContext.xml)中通过scope属性进行控制。当scope属性默认的为singleton(单例),这个时候bean是在spring容器启动的时候进行加载和实例化并且是单实例的;当你将scope属性改为prototype的时候,这种情况下bean将在bean被调用时实例化并且每次调用生成一个bean的实例。(request,session,global session属性将在web变成是再学习)
lazy-init属性默认为false,即在spring容器启动时加载并实例化配置文件中定义的所有 bean,当然当我们指定为true的时候,bean将在程序调用的时候才初始化,该属性定义在
同时可以指定bean的初始化方法init-method属性和销毁方法destroy-method属性。
作用域范围是单例的bean是在实例化容器的时候就实例化。
作用域范围是prototype的bean是在getBean的时候被实例化的。
作用与范围是单实例并且lazy-init="true",是在getBean的时候被实例化的。
也可以指定beans节点的属性default-lazy-init=true
lazy-init的缺点是不能再启动时发现实例化的错误,只能在运行期发现,这点是我们不太希望看到的
如果在生成bean时需要对某些资源进行初始化,可以指定init-method="init",方法名指定为类里面的方法名。此方法是在实例化过后执行。如果在bean被销毁前要关闭一些资源,可以指定destroy-method="destroy"
需要调用spring容器的close方法进行关闭才能执行销毁方法,与前面代码有一定不同。
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
ctx.close();
Bean的生命周期:
(1)实例化(必须的)构造函数构造对象
(2)装配(可选的)为属性赋值
(3)回调(可选的)(容器-控制类和组件-回调类)
(4)初始化(init-method=" ")
Q6:spring bean初始化的完整生命周期是怎样的
为了演示spring的生命周期,首先必须要加入spring的相关包
新建一个SpringBoy类 实现BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean
要注意加入相关的包。
新建一个processor类,用于处理bean,叫作bean处理器,在xml中作如下配置:
分别实现它们的方法。并在方法中加入必须的信息,以便后面理解与观察。
在配置文件中配置springboy。指定初使化方法与销毁方法
新建一个测试类,并指定要加载的xml文件
运行测试类,得到运行结果
从结果中分析出运行的过程:
首先,生命周期一开始,它会去调用我们的构造函数。
然后,它会去调用你的属性设置,也就是seter属性。
三:因为我们实现了BeanNameAware,所以可以看出,它紧接着,会去设置我们的bean name,也就是为我们的bean创建后个名字,调用的是setBeanName方法
四:因为我们实现了BeanFactoryAware,所以可以看出,在设置完beanName过后,它会去创建我们的bean工厂,也就是我们的BeanFactory ,有了它,我们就可以去getBean了。
五:在bean工厂过后,因为我们创建了bean处理器implements BeanPostProcessor,所以说在这过后,它执行的是:处理器,处理器,会在初使化之前执行或是初使化之后执行,分别有两个方法:postProcessAfterInitialization,postProcessBeforeInitialization
六:在处理器执行完过后,如果说我们还实现了预处理器InitializingBean,那么它会紧接着执行。在处理器后置方法前执行,称为前处理器,后置的那个方法,也把它叫作处理器方法或是后预处理方法postProcessAfterInitialization。
七:初使化方法执行。
八:postProcessAfterInitialization,后预处理器执行。
九:因为我们实现了DisposableBean,所以说最后我们在调用:conn.registerShutdownHook
方法过后,就会执行销毁方法:destroy();如果说我们还有一个自定义的destroy方法,那么也会执行该方法,该方法也可以命名为destroy方法。
10:没了。销毁过后生命周期结束。
www.Yi+JITaO.COm