Spring--入門第一天
一.bean之間的關系
bean的繼承配置:
使用bean的parent屬性指定繼承哪個bean的配置;此時可以不用配置父類中已有的屬性配置。並不是 <bean> 元素裏的所有屬性都會被繼承. 比如: autowire, abstract 等
<bean id="address1" class="yang.mybatis.test.Address" p:city="BeiJing" p:street="TianAnMen" ></bean> <bean id="address2" p:street="ZhongGuanCun" parent="address1"></bean>
抽象bean可以不指定class屬性,抽象bean bean的abstract=“true”的bean,這樣的bean不能被IOC容器實例化,只能用來被繼承。
depends-on 依賴配置
depend-on用來表示一個Bean的實例化依靠另一個Bean先實例化,如果在一個bean A上定義了depend-on B那麽就表示:A 實例化前先實例化 B。
二.Bean的作用域
在 Spring 中, 可以在 <bean> 元素的 scope 屬性裏設置 Bean 的作用域.
默認情況下, Spring 只為每個在 IOC 容器裏聲明的 Bean 創建唯一一個實例, 整個 IOC 容器範圍內都能共享該實例:所有後續的 getBean() 調用和 Bean 引用都將返回這個唯一的 Bean 實例.該作用域被稱為 singleton, 它是所有 Bean 的默認作用域.在創建IOC容器時bean被實例化,調用其構造方法。
類別 | 說明 |
singleton | 在SpringIOC 容器中僅存在一個Bean實例,Bean以單實例的方式存在 |
prototype | 每次調用getBean()時都會返回一個新的實例 |
request | 每次HTTP請求都會創建一個新的Bean,該作用域僅適用於WebApplicationContext環境 |
session | 同一個HTTP Session共享一個Bean,不同的HTTP Session使用不同的Bean.該作用域僅適用於WebApplicationcontext環境 |
三.使用外部屬性文件
Spring 提供了一個 PropertyPlaceholderConfigurer 的 BeanFactory 後置處理器, 這個處理器允許用戶將 Bean 配置的部分內容外移到屬性文件中. 可以在 Bean 配置文件裏使用形式為 ${var} 的變量, PropertyPlaceholderConfigurer 從屬性文件裏加載屬性, 並使用這些屬性來替換變量.
註冊 PropertyPlaceholderConfigurer
- Spring 2.0:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="db.properties"></property> </bean>
- Spring 2.5 之後:
可通過 <context:property-placeholder> 元素簡化:
<beans> 中添加 context Schema 定義xmlns:context="http://www.springframework.org/schema/context"
在配置文件中加入如下配置:
<!--引入文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 數據庫連接池,使用dbcp --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> classpath類路徑下的db.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8 jdbc.username=root jdbc.password=1234
4.Spring 表達式語言(簡稱SpEL):
是一個支持運行時查詢和操作對象的強大的表達式語言。語法類似於 EL:SpEL 使用 #{…} 作為定界符,所有在大框號中的字符都將被認為是 SpEL
SpEL 為 bean 的屬性進行動態賦值提供了便利
- 通過 SpEL 可以實現:
- 通過 bean 的 id 對 bean 進行引用
- 調用方法以及引用對象中的屬性
- 計算表達式的值
- 正則表達式的匹配
字面量的表示:
整數:<property name="count" value="#{5}"/> 小數:<property name="frequency" value="#{89.7}"/> 科學計數法:<property name="capacity" value="#{1e4}"/> Boolean:<property name="enabled" value="#{false}"/>
引用其他對象
<!--通過value屬性和SpEL配置Bean之間的引用關系--> <property name="car" value="#{car}"></property>
引用其他對象的屬性
<!--通過value屬性和SpEL配置一個Bean的屬性值為另一個Bean的屬性值--> <property name="carPrice" value="#{car.price}"></property>
調用其他方法,還可以鏈式操作
<property name="carPrice" value="#{car.price.toString().toUpperCase}"></property>
調用靜態方法或靜態屬性:通過 T() 調用一個類的靜態方法,它將返回一個 Class Object,然後再調用相應的方法或屬性:
<property name="initValue" value="#{T(java.lang.Math).PI}"></property>
五.IOC 容器中Bean 的生命周期
Spring IOC 容器可以管理 Bean 的生命周期, Spring 允許在 Bean 生命周期的特定點執行定制的任務.
Spring IOC 容器對 Bean 的生命周期進行管理的過程:
- 通過構造器或工廠方法創建 Bean 實例(調用構造器)
- 為 Bean 的屬性設置值和對其他 Bean 的引用(調用setter方法)
- 調用 Bean 的初始化方法 (調用配置文件中配置的init-method)
- 使用bean
- 當容器關閉時, 調用 Bean 的銷毀方法(調用配置文件中配置的destory-method)
在 Bean 的聲明裏設置 init-method 和 destroy-method 屬性, 為 Bean 指定初始化和銷毀方法.同時Bean類中設置這兩個方法
<bean id="address" class="yang.mybatis.test.Address" init-method="init" destroy-method="destory" p:city="BeiJing" p:street="TianAnMen"/>
六.創建 Bean 後置處理器
Bean 後置處理器允許在調用初始化方法前後對 Bean 進行額外的處理.
Bean 後置處理器對 IOC 容器裏的所有 Bean 實例逐一處理, 而非單一實例. 其典型應用是: 檢查 Bean 屬性的正確性或根據特定的標準更改 Bean 的屬性.
創建自定義後置處理器, 需要實現接口(org.springframework.bean.config.BeanPostProcessor). 在初始化方法被調用前後, Spring 將把每個 Bean 實例分別傳遞給上述接口的以下兩個方法:
// init 方法之後調用 postProcessAfterInitialization(java.lang.Object bean, java.lang.String beanName) //init 方法之前調用 postProcessBeforeInitialization(java.lang.Object bean, java.lang.String beanName)
bean:bean實例名字
beanName:IOC容器配置的id
在Spring配置文件中配置自定義Bean後置處理器
<bean class="自定義後置處理器的全路徑名"></bean>
添加 Bean 後置處理器後 Bean 的生命周期
Spring IOC 容器對 Bean 的生命周期進行管理的過程:
- 通過構造器創建 Bean 實例
- 為 Bean 的屬性設置值和對其他 Bean 的引用
- 將 Bean 實例傳遞給 Bean 後置處理器的 postProcessBeforeInitialization 方法
- 調用 Bean 的初始化方法
- 將 Bean 實例傳遞給 Bean 後置處理器的 postProcessAfterInitialization方法
- 使用Bean
- 當容器關閉時, 調用 Bean 的銷毀方法
Spring--入門第一天