Spring AOP 軟件系統通常由多個組件構成
每個組件負責一個特定的功能領域
但是
這些組件也經常承擔它們的核心功能之外的額外責任
系統服務(例如日志
事務管理和安全性)經常發現自己跑到了別的組件的領域裡
而這些組件的核心職責是其他事情
結果就是所謂的
代碼糾纏
或者更簡單點兒說
一團糟
面向方面編程是一種試圖解決這個問題的編程技術
它把關注點的隔離提升為核心的編程概念
使用 AOP 時
仍然是在一個地方定義系統的公共功能
但是可以聲明性地定義 如何 和 在哪裡 應用這個功能
如果對橫切關注點(例如日志和事務管理)進行了模塊化
那麼不用修改每個單獨的類
就可以向代碼中添加新特性
這類模塊化的關注點稱作 方面
您知道麼? 可以在任何 Java? 企業版(J
EE) 服務器中使用 Spring 框架的功能
而且
還可以調整它的大多數功能
使其適合不受控環境
Spring 的中心焦點就是支持不被束縛在特定 J
EEE 服務上的可重用業務和數據訪問對象
可以跨 J
EE 環境(Web 或企業 JavaBean(EJB))
獨立應用程序
測試環境等等重用這類對象
而不會有任何麻煩
以一個企業應用程序為例
這類應用程序通常要求類似於安全性和事務支持的服務
顯然
可以把這些服務的支持直接編寫到要求服務的每個類當中
但是更希望能夠不必為大量事務性上下文編寫同樣的事務處理代碼
如果使用 Spring AOP 進行事務處理
那麼可以聲明性地安排適當的方法調用
而不必逐個安排
Spring AOP 提供了幾個方面
可以為 JavaBean 聲明事務
例如
TransactionProxyFactoryBean 是個方便的代理類
能夠攔截對現有類的方法調用
並把事務上下文應用到事務 bean
在下面的示例中會看到這個類的實際應用
Hibernate Spring 框架提供了對 Hibernate
JDO 和 iBATIS SQL Maps 的集成支持
Spring 對 Hibernate 的支持是第一級的
整合了許多 IOC 的方便特性
解決了許多典型的 Hibernate 集成問題
框架對 Hibernate 的支持符合 Spring 通用的事務和數據訪問對象(DAO)異常層次結構
Spring 為使用選擇的 OR 映射層來創建數據訪問應用程序提供了支持
因為所有東西都設計成一組可重用 JavaBean
所以不管選擇什麼技術
都能以庫的格式訪問大多數 Spring 的 OR 映射支持
ApplicationContext 或 BeanFactory 內部的 OR 映射的好處是簡化了配置和部署
Hibernate 是 Java 平台上一個功能全面的
開源的 OR 映射框架
Hibernate 支持開發符合常規 Java 理念的持久性類 —— 包括關聯
繼承
多態
復合以及 Java 集合框架
Hibernate 查詢語言(HQL)被設計成 SQL 的一個微型面向對象擴展
它是對象和關系世界之間的橋梁
Hibernate 也支持用原始 SQL 或基於 Java 的標准和示例查詢表達查詢
Hibernate 使用 XML(*
hbm
xml) 文件把 Java 類映射到表
把 JavaBean 屬性映射到數據庫表
通過 JDBC 技術
支持所有的 SQL 數據庫管理系統
Hibernate 與所有流行的 J
EE 應用程序服務器和 Web 容器都很好地集成
實際示例 一個銀行應用程序示例可以讓您自己看到 Spring AOP 和 Hibernate 一起工作有多麼好
銀行帳戶用例允許用戶 (Customer) 在一個事務中打開一個或多個銀行帳戶
用戶可以申請多個銀行帳戶
可以選擇是支票帳戶類型或者是儲蓄帳戶類型
應用程序數據庫(Cloudscape?)容納所有客戶和帳戶信息
在這個例子中
假設在 Customer 和 Account 類之間存在
:N 的關聯
在實際生活場景中
關聯可能需要按 m:n 建模
才能支持聯合帳戶
由於用戶必須可以在一個事務中申請多個帳戶
所以首先要為數據庫交互實現一個 DOA 模式
然後要設置 Spring AOP 的 TransactionProxyFactoryBean
讓它攔截方法調用並聲明性地把事務上下文應用到 DOA
Hibernate 實踐 在 Spring 框架中
像 JDBC DataSource 或 Hibernate SessionFactory 這樣的資源
在應用程序上下文中可以用 bean 實現
需要訪問資源的應用程序對象只需通過 bean 引用得到這類預先定義好的實例的引用即可(這方面的更多內容在 下一節中)
在清單
中
可以看到示例銀行應用程序的一段摘錄
XML 應用程序上下文定義顯示了如何設置 JDBC DataSource
並在上面放一個 Hibernate SessionFactory
清單
JDBC DataSource 和 HibernateSessionFactory 連接
<!
DataSource Property
>
<bean id=
exampleDataSource
class=
mons
dbcp
BasicDataSource
>
<property name=
driverClassName
>
<value>org
apache
derby
jdbc
EmbeddedDriver</value>
</property>
<property name=
url
>
<value>jdbc:derby:springexample;create=true</value>
</property>
</bean>
<!
Database Property
>
<bean id=
exampleHibernateProperties
class=
org
springframewonfig
PropertiesFactoryBean
>
<property name=
properties
>
<props>
<prop key=
hibernate
hbm
ddl
auto
>update</prop>
<prop
key=
hibernate
dialect
>net
sf
hibernate
dialect
DerbyDialect</prop>
<prop
key=
hibernate
query
substitutions
>true
T
false
F
</prop>
<prop key=
hibernate
show_sql
>false</prop>
<prop key=
hibernate
c
p
minPoolSize
>
</prop>
<prop key=
hibernate
c
p
maxPoolSize
>
</prop>
<prop key=
hibernate
c
p
timeout
>
</prop>
<prop key=
hibernate
c
p
max_statement
>
</prop>
<prop
key=
hibernate
c
p
testConnectionOnCheckout
>false</prop>
</props>
</property>
</bean>
<!
Hibernate SessionFactory
>
<bean id=
exampleSessionFactory
class=
org
springframework
orm
hibernate
LocalSessionFactoryBean
>
<property name=
dataSource
>
<ref local=
exampleDataSource
/>
</property>
<property name=
hibernateProperties
>
<ref bean=
exampleHibernateProperties
/>
</property>
<!
OR mapping files
>
<property name=
mappingResources
>
<list>
<value>Customer
hbm
xml</value>
<value>Account
hbm
xml</value>
</list>
</property>
</bean>
清單
顯示了如何為示例應用程序數據庫(是 Cloudscape)配置數據源 bean (exampleDataSource)
exampleDatasource 被連接到 Spring Hibernate 的 SessionFactory
請注意 *
hbm
xml 指定了示例應用程序的 OR 映射文件
數據源和會話工廠設置好之後
下一步就是在 DAO 中連接
在 CustomerDAOImpl 示例中
要使用 SessionFactory
接下來
插入 Spring 的 TransactionProxyFactoryBean
它會攔截對應用程序的 CustomerDAOImpl 對象的方法調用
並聲明性地在它上面應用事務
在 清單
的這個示例中
CustomerDAOImpl 類的 addCustomer 方法是作為事務的一部分執行的
有一個事務屬性 PROPAGATION_REQUIRED
這個屬性等價於 EJB 容器的 TX_REQUIRED
如果想讓這個方法一直在事務中運行
可以使用 PROPAGATION_REQUIRED
如果事務已經在運行
那麼 bean 方法會加入事務
否則 Spring 的輕量級事務管理器會啟動一個事務
如果想在調用組件服務時總是啟動新事務
可以使用 PROPAGATION_REQUIRES_NEW 屬性
應用程序的連接完成之後
現在來進一步查看源代碼
分析這個! 如果以前沒這麼做過
那麼請 下載這篇文章的源代碼
把源 zip 文件釋放到計算機中的任何位置上
例如 c:\
會創建一個叫作 SpringProjectPart
的文件夾
src\spring 文件夾包含示例應用程序的 Hibernate 映射文件和 Spring 配置文件
src\springexample\hibernate 文件包含應用程序的源代碼
在這裡會發現兩個類
即 Customer 和 Account
它們用 Hibernate 映射文件映射到兩個表
Customer 類代表客戶信息
Account 代表客戶的帳戶信息
正如前面提到的
我把這兩個類按照
: N 關系進行建模
即一個 Customer 可以擁有多個 Account
清單
顯示了 Customer 對象的 Hibernate 映射文件
清單
Customer 對象的 Hibernate 映射文件
<?xml version=
?>
<!DOCTYPE hibernate
mapping PUBLIC
//Hibernate/Hibernate Mapping DTD
//EN
mapping
dtd
>
<hibernate
mapping>
<class
name=
springexample
hibernate
Customer
table=
TBL_CUSTOMER
dynamic
update=
false
dynamic
insert=
false
>
<id
name=
id
column=
CUSTOMER_ID
type=
java
lang
Long
unsaved
value=
>
<generator class=
native
>
</generator>
</id>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28882.html