1.利用ApplicationContext來獲取bean對(duì)象桶蛔,bean的生命周期
當(dāng)bean被載入容器時(shí)漫谷,他的生命周期就開始了。
(1)實(shí)例化
當(dāng)我們加載bean.xml文件時(shí)抖剿,就開始實(shí)例化了,實(shí)例化到內(nèi)存斩郎,前提是scope=singleton)---當(dāng)實(shí)例化時(shí),構(gòu)造方法先被調(diào)用)
(2)設(shè)置屬性(前提是要有一個(gè)對(duì)應(yīng)的set方法)
調(diào)用set方法設(shè)置屬性
(3)調(diào)用BeanNameAware的setBeanName()方法
如果你實(shí)現(xiàn)了BeanNameAware接口缩宜,則可以通過setBeanName來獲取bean的id
(4)調(diào)用BeanFactoryAware的setBeanFactory()方法
該方法可以傳遞beanFactory,如果你實(shí)現(xiàn)BeanNameAware接口妓布,則可以獲取beanFactory
(5)調(diào)用ApplicationContextAware的setApplicationContext()方法
如果你實(shí)現(xiàn)ApplicationContextAware接口宋梧,則可以得到ApplicationContext
(6)若BeanPostProcessor(后置處理器,具體介紹在下面)和bean關(guān)聯(lián)后(關(guān)聯(lián):先建一個(gè)類myBeanPostProcessor來實(shí)現(xiàn)BeanPostProcessor捂龄,再在beans.xml配置一下)
postProcessBeforeInitialzation()方法先被調(diào)用。(預(yù)初始化方法)
(7)若你實(shí)現(xiàn)了InitializingBean接口倦沧,則會(huì)調(diào)用afterPropertiesSet
(8)調(diào)用定制的初始化方法唇撬,在beans.xml文件bean中寫
(9)調(diào)用后初始化方法postProcessAtfterInitialzation()
(10)使用我們的bean
(11)容器關(guān)閉
(12)調(diào)用DisposableBean接口的destory()方法
包括關(guān)閉數(shù)據(jù)連接、socket展融、文件流釋放bean占用的資源窖认,不習(xí)慣用
(13)第12步的方法少用,經(jīng)常用自己定制的銷毀方法告希,在beans.xml中設(shè)置
原理圖:
2.關(guān)于BeanPostProcessor(后置處理器)
--在用后置處理器時(shí)扑浸,我們可以建一個(gè)類myBeanPostProcessor來實(shí)現(xiàn)BeanPostProcessor,其中有兩個(gè)方法before暂雹、after
--在beans.xml配置一下首装,就會(huì)被自動(dòng)調(diào)用,先是before()再是after()
--BeanPostProcessor有點(diǎn)類似于web里的filter過濾器
--需求應(yīng)用:1.記錄每個(gè)對(duì)象被實(shí)例化的時(shí)間
?? ??? ??? ??? ?? ??2.過濾每個(gè)調(diào)用對(duì)象的ip
?? ??? ??? ??? ?? ? 3.給所有對(duì)象添加屬性
--這些應(yīng)用體現(xiàn)了AOP編程(面向切面編程仙逻,針對(duì)所有對(duì)象編程)
3.小結(jié)
實(shí)際開發(fā)中沒用到這么多過程,則常用的過程為:1>2>6>9>10>11>13
4.通過bean工廠來獲取bean涧尿,bean的生命周期
1>2>3>4>7>8>10>11>12>13
5.代碼實(shí)現(xiàn)
userService
myBeanPostProcessor
beans.xml
testBean