﻿<?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-huxiaowi-随笔分类-Spring</title><link>http://www.blogjava.net/huxiaowi/category/43743.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 25 Jan 2010 14:50:19 GMT</lastBuildDate><pubDate>Mon, 25 Jan 2010 14:50:19 GMT</pubDate><ttl>60</ttl><item><title> Spring中Bean的生命周期 </title><link>http://www.blogjava.net/huxiaowi/archive/2009/06/23/283775.html</link><dc:creator>Charlee</dc:creator><author>Charlee</author><pubDate>Tue, 23 Jun 2009 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/huxiaowi/archive/2009/06/23/283775.html</guid><wfw:comment>http://www.blogjava.net/huxiaowi/comments/283775.html</wfw:comment><comments>http://www.blogjava.net/huxiaowi/archive/2009/06/23/283775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huxiaowi/comments/commentRss/283775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huxiaowi/services/trackbacks/283775.html</trackback:ping><description><![CDATA[<font size="2">在spring中，从BeanFactory或ApplicationContext取得的实例为Singleton，也就是预设为每一个Bean的别名只能维持一个实例，而不是每次都产生<br />
一个新的对象<br />
使用Singleton模式产生单一实例，对单线程的程序说并不会有什么问题，但对于多线程的程序，就必须注意安全(Thread-safe)的议题，防止多个线程<br />
同时存取共享资源所引发的数据不同步问题。<br />
然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例：例如：<br />
&lt;bean id="helloBean" class="onlyfun.caterpillar.HelloBean" singleton="false"&gt;<br />
在spring中，singleton属性默认是true，只有设定为false，则每次指定别名取得的Bean时都会产生一个新的实例</font>
<p><font size="2">一个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 id="helloBean" 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 id="helloBean" class="onlyfun.caterpillar.HelloBean" 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()及之后的流程</font></p>
 <img src ="http://www.blogjava.net/huxiaowi/aggbug/283775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huxiaowi/" target="_blank">Charlee</a> 2009-06-23 16:56 <a href="http://www.blogjava.net/huxiaowi/archive/2009/06/23/283775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>