裝配bean基於XML
1.例項化方式
3種例項化bean的方式:預設構造、靜態工廠、例項工廠
預設構造:<bean id="" class="">//預設構造(必須提供預設構造)
靜態工廠:常用於spring整合其他框架(工具)
用於生成例項物件,所有的方法必須是static
<bean id="" class="工廠全限定類名(包名+類名)" factory-method="靜態方法">
例項工廠:
必須先有工廠例項物件,通過例項物件建立物件,提供所有的方法都是非靜態的
//建立工廠例項
<bean id="工廠例項id名" class="全限定類名"></bean>
//獲取service
//factory-bean:確定工廠例項
//factory-method:確定普通方法
<bean id="...service" factory-bean="工廠例項id名" factory-method="方法名"></bean>
此處有一個問題:
普通的bean都是<bean id="" class="FB"></bean>,spring直接建立A例項,並返回()//相當於FB fb = new FB();return fb
而FactoryBean是一個特殊的bean,它具有工廠生產物件的能力,只能生成特定的一個物件
bean必須使用FactoryBean介面,此介面提供方法getObject()用於獲得特定bean
<bean id="" class="FB">先建立FB例項,然後呼叫getObject(),並返回方法的返回值
相當於FB fb = new FB();return fb.getObject()
BeanFactory和FactoryBean對比:
BeanFactory:工廠,用於生成任意bean,也就是之前用的普通bean
FactoryBean:是特殊的bean,它是用來生成另一個特定+的bean
spring作用域:scope="singleton/prototype/request/session/global seesion"
初始化和消亡:
init-method:用於配置初始化方法,準備資料
destroy-method :用於配置銷燬方法,清理資源
目標方法執行前執行後,將進行初始化或銷燬
<bean id="" init-method="初始化方法名" destroy-method="銷燬方法名">
注:銷燬方法執行有兩個條件,一是容器必須close,二是必須是單例的(即在配置中scope="singleton")
String xmlPath = "..../beans.xml";
Application application = new ClassPathXmlApplicationContext(xmlPath);
application .close()
//applicationContext.getClass().getMethod("close").invoke(applicationContext);
BeanPostProcessor後處理Bean
Spring提供一種機制,只要實現此埠BeanPostProcessor,並將實現類提供給spring容器,sring容器將自動執行,在初始化方法前執行
before(),在初始化後執行after()
Spring提供工廠勾子,用於修改例項物件,可以生成代理物件,是AOP底層
模擬過程:
A a = new A();
a = B.before(a);
a.init();
a = B.after(a);(前面的相當於是代理a) //將a的例項物件傳遞給後處理bean,可以生成代理物件並返回
a.add();//生成代理物件,目的是在目標方法前後執行(例如:開啟事務、提交事務)
a.destroy();