﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-出来混的-文章分类-spring</title><link>http://www.blogjava.net/zhenlishiwo/category/47435.html</link><description>总是要回的</description><language>zh-cn</language><lastBuildDate>Mon, 27 Dec 2010 15:04:47 GMT</lastBuildDate><pubDate>Mon, 27 Dec 2010 15:04:47 GMT</pubDate><ttl>60</ttl><item><title>Spring中Bean的生命周期(转)</title><link>http://www.blogjava.net/zhenlishiwo/articles/341368.html</link><dc:creator>zhenlishiwo</dc:creator><author>zhenlishiwo</author><pubDate>Thu, 23 Dec 2010 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhenlishiwo/articles/341368.html</guid><wfw:comment>http://www.blogjava.net/zhenlishiwo/comments/341368.html</wfw:comment><comments>http://www.blogjava.net/zhenlishiwo/articles/341368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhenlishiwo/comments/commentRss/341368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhenlishiwo/services/trackbacks/341368.html</trackback:ping><description><![CDATA[Spring中Bean的生命周期<br />
在spring中，从BeanFactory或ApplicationContext取得的实例为Singleton，也就是预设为每一个Bean的别名只能维持一个实例，而不是每次都产生<br />
一个新的对象<br />
使用Singleton模式产生单一实例，对单线程的程序说并不会有什么问题，但对于多线程的程序，就必须注意安全(Thread-safe)的议题，防止多个线程<br />
同时存取共享资源所引发的数据不同步问题。<br />
然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例：例如：<br />
&lt;bean singleton="false"&gt;<br />
在spring中，singleton属性默认是true，只有设定为false，则每次指定别名取得的Bean时都会产生一个新的实例<br />
一个Bean从创建到销毁，如果是用BeanFactory来生成,管理Bean的话，会经历几个执行阶段：<br />
&nbsp;&nbsp;&nbsp; 1：Bean的建立：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有BeanFactory读取Bean定义文件，并生成各个Bean实例<br />
&nbsp;&nbsp;&nbsp; 2：属性注入：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行相关的Bean属性依赖注入<br />
&nbsp;&nbsp;&nbsp; 3：BeanNameAware的setBeanName()：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果Bean类有实现org.springframework.beans.BeanNameAware接口，则执行它的setBeanName()方法<br />
&nbsp;&nbsp;&nbsp; 4：BeanFactoryAware的setBeanFactory()：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口，则执行它的setBeanFactory()方法<br />
&nbsp;&nbsp;&nbsp; 5：BeanPostProcessors的ProcessBeforeInitialization()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果任何的org.springframework.beans.factory.config.BeanPostProcessors实例与Bean实例相关。则执行BeanPostProcessors实例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的processBeforeInitialization()方法<br />
&nbsp;&nbsp;&nbsp; 6：initializingBean的afterPropertiesSet()：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果Bean类已实现org.springframework.beans.factory.InitializingBean接口，则执行他的afterProPertiesSet()方法<br />
&nbsp;&nbsp;&nbsp; 7：Bean定义文件中定义init-method：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以在Bean定义文件中使用"init-method"属性设定方法名称例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean calss="onlyfun.caterpillar.HelloBean" init-method="initBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果有以上设置的话，则执行到这个阶段，就会执行initBean()方法<br />
&nbsp;&nbsp;&nbsp; 8：BeanPostProcessors的ProcessaAfterInitialization()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果有任何的BeanPostProcessors实例与Bean实例关联，则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法<br />
&nbsp;&nbsp;&nbsp; 9：DisposableBean的destroy()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在容器关闭时，如果Bean类有实现org.springframework.beans.factory.DisposableBean接口，则执行他的destroy()方法<br />
&nbsp;&nbsp;&nbsp; 10：Bean定义文件中定义destroy-method<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在容器关闭时，可以在Bean定义文件中使用"destroy-method"属性设定方法名称，例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean destroy-method="destroyBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果有以上设定的话，则进行至这个阶段时，就会执行destroyBean()方法，如果是使用ApplicationContext来生成并管理Bean的话<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 则稍有不同，使用ApplicationContext来生成及管理Bean实例的话，在执行BeanFactoryAware的setBeanFactory()阶段后，若Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类上有实现org.springframework.context.ApplicationContextAware接口，则执行其setApplicationContext()方法，接着才执行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanPostProcessors的ProcessBeforeInitialization()及之后的流程<br />
<br />
<br />
<img src ="http://www.blogjava.net/zhenlishiwo/aggbug/341368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhenlishiwo/" target="_blank">zhenlishiwo</a> 2010-12-23 10:09 <a href="http://www.blogjava.net/zhenlishiwo/articles/341368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>