1. Bean 工廠(BeanFactory)的功能和配置
I、 ClassPathResource
l 在類路徑下查找資源
l 另有 FileSystemResource
II、 XmlBeanFactory
l 讀取 xml 文件中的配置信息
l 生產bean
l 解決bean 依賴
2. Bean 的創建
spring可調用bean的構造方法,或通過工廠方法生產 bean對象
I、 利用 bean 的構造方法創建bean
l 無參的構造方法(通過set方法設置,一定要有set方法)
<bean id="refName" class="com.xasxt.UserDao"> <property name="username" value="root"/> <property name="password" value="123"/> </bean> |
l 有參的構造方法,需指明構造方法的參數列表,通過:
<bean id="refName" class=" com.xasxt.UserDao "> <construct-arg><value>root</value></construct-arg> <construct-arg><value>123</value></construct-arg> </bean> 表明調用了有兩個參數的構造方法 |
II、 通過工廠方法獲得 bean對象
bean 沒有公共的構造方法,需通過工廠類或工廠實例來創建
分爲靜態工廠和實例工廠方法兩種情況
l 靜態工廠方法:
class 指明工廠類,factory-method 指明工廠方法如: Connection con=DriverManager.getConnection(url,user,pwd); 對應的配置: <beanid="con" class="java.sql.DriverManager" factory-method="getConnection"> <construct-arg><value>jdbc:mysql://localhost/test</value></construct-arg> <construct-arg><value>zhangsan</value></construct-arg> <construct-arg><value>pwd</value></construct-arg> </bean> 工廠方法參數和構造方法參數設置的形式相同
|
l 實例工廠方法:
要先創建工廠實例,然後再由工廠實例創建產品
如: Statement stmt = con.createStatement(); con 對象是工廠 stmt 對象是產品 配置爲: <bean id="con" class="java.sql.DriverManager" factory-method="getConnection"> …… </bean> <bean id="stmt" factory-bean="con" factory-method="createStatement"/> |
3. Bean的作用域
Bean作用域(scope屬性)
作用域 |
描述 |
在每個Spring IoC容器中一個bean定義對應一個對象實例。 |
|
一個bean定義對應多個對象實例。 |
|
在一次HTTP請求中,一個bean定義對應一個實例;即每次HTTP請求將會有各自的bean實例,它們依據某個bean定義創建而成。該作用域僅在基於web的Spring ApplicationContext情形下有效。 |
|
在一個HTTP Session中,一個bean定義對應一個實例。該作用域僅在基於web的Spring ApplicationContext情形下有效。 |
|
在一個全局的HTTP Session中,一個bean定義對應一個實例。典型情況下,僅在使用portlet context的時候有效。該作用域僅在基於web的Spring ApplicationContext情形下有效。 |
bean工廠生產bean 缺省都是單例的(singleton)
後兩者用於web應用中
4. 通過注入解決bean的依賴
I、 依賴注入的兩種方式
l set 注入
spring 直接利用了bean的set或構造方法
避免了使用接口注入的侵入性
<bean id="person" class="com.xasxt.spring.Person"> <!-- set方法設置注入 --> <property name="id" value="001"/> <property name="name" value="zhangsan"/> <property name="sex" value="M"/> <property name="mari" value="false"/> <property name="salary" value="4500"/> </bean> |
l 構造方法注入
<bean id="person" class="com.xasxt.spring.Person"> <!-- 構造方法的方式注入 --> <constructor-arg> <value>002</value> </constructor-arg> <constructor-arg> <value>lisi</value> </constructor-arg> <constructor-arg> <value>false</value> </constructor-arg> <constructor-arg> <value>M</value> </constructor-arg> <constructor-arg> <value>5000</value> </constructor-arg> </bean> |
II、 依賴的目標類型分成三種形式:
l 基本類型+String
<value>data</value>
類型自動轉化
l 對其他bean的引用
<bean id="prop" abstract="true"><!—只作爲模板,不能被實例化--> <property name="address" value="beijing"></property> </bean> <!—上面是公共屬性注入,下面可以引用--> <bean id="stu" class="com.xasxt.dependency.Student" parent="prop"><!—可以引用公共屬性--> <property name="name" value="zhangsan"></property> <property name="code" value="01101"></property> </bean> <bean id="tea" class="com.xasxt.dependency.Teacher" parent="prop"><!—可以引用公共屬性--> <property name="name" value="Li Sir"></property> <property name="job" value="java teacher"></property> </bean> <!-- 普通裝配 --> <bean id="c" class="com.xasxt.dependency.Class"> <property name="name" value="class One"></property> <property name="teacher" ref="tea"></property> <property name="stus"> <list> <ref bean="stu"/> </list> </property> </bean> |
l 集合類型
Set
<property name="sets"> <set> <value>wangso</value> <value>haoren</value> <value>ganka</value> </set> </property> |
Array和List同樣設置
List
Map
<property name="map"> <map> <entry key="aaa"> <value>7688</value> </entry> <entry key="bbb"> <value>9788</value> </entry> <entry key="ccc"> <value>8769</value> </entry> </map> </property> |
III、 讓spring 自動裝配bean,解決依賴
autowire屬性指明自動裝配的依據: byName--- id的值=bean中的property名 byType--- 屬性的類型=當前工廠中bean的類型 constructor--構造方法參數的類型=當前工廠中bean的類型 autodetect-- constructor ---> byType autowire-candidate屬性 指明是否作爲 autowire 的候選對象(true或false) 解決多個候選對象的衝突 |
IV、 讓容器檢測 bean 所有的依賴是否都已經滿足
防止bean的遺漏裝配,在運行後出現莫名奇妙的情況,可以設置下列屬性 dependency-check屬性指明應檢查的目標類型 simple -- 基本類型+字符串+集合 objects --- 對其他bean的依賴 all---對各類型都檢查 none -- 默認值 |
V、 通過classpath自動掃描方式把組件納入spring容器中管理
1、需要在文件中加入下面一句配置:
<context:component-scan base-package="com.xasxt.spring"/>
黃色是包名
2、還需要在各個類中加入下列註解之一:
@Service @Controller @Repository @Component