1. 程式人生 > >Spring--入門第一天

Spring--入門第一天

conf web 處理 frequency 添加 cati eth tex post

一.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 的生命周期進行管理的過程:

  1. 通過構造器或工廠方法創建 Bean 實例(調用構造器)
  2. 為 Bean 的屬性設置值和對其他 Bean 的引用(調用setter方法)
  3. 調用 Bean 的初始化方法 (調用配置文件中配置的init-method)
  4. 使用bean
  5. 當容器關閉時, 調用 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 的生命周期進行管理的過程:

  1. 通過構造器創建 Bean 實例
  2. 為 Bean 的屬性設置值和對其他 Bean 的引用
  3. 將 Bean 實例傳遞給 Bean 後置處理器的 postProcessBeforeInitialization 方法
  4. 調用 Bean 的初始化方法
  5. 將 Bean 實例傳遞給 Bean 後置處理器的 postProcessAfterInitialization方法
  6. 使用Bean
  7. 當容器關閉時, 調用 Bean 的銷毀方法

Spring--入門第一天