一為什麼要用框架和模式 為什麼要用模式?
因為模式是一種指導
在一個良好的指導下
有助於你完成任務
有助於你作出一個優良的設計方案
達到事半功倍的效果
而且會得到解決問題的最佳辦法
為什麼要用框架?
因為軟件系統發展到今天已經很復雜了
特別是服務器端軟件
設計到的知識
內容
問題太多
在某些方面使用別人成熟的框架
就相當於讓別人幫你完成一些基礎工作
你只需要集中精力完成系統的業務邏輯設計
而且框架一般是成熟
穩健的
他可以處理系統很多細節問題
比如
事物處理
安全性
數據流控制等問題
還有框架一般都經過很多人使用
所以結構很好
所以擴展性也很好
而且它是不斷升級的
你可以直接享受別人升級代碼帶來的好處
總之:就是讓開發更簡單
讓我們成功
二 AOP AOP是什麼?
AOP是OOP的延續
是Aspect Oriented Programming的縮寫
意思是面向方面編程
AOP實際是GoF設計模式的延續
設計模式孜孜不倦追求的是調用者和被調用者之間的解耦
AOP可以說也是這種目標的一種實現
切面意義何在?
就可以在這層切面上進行統一的集中式權限管理
而業務邏輯組件則無需關心權限方面的問題
也就是說
通過切面
我們可以將系統中各個不同層次上的問題隔離開來
實現統一集約式處理
各切面只需集中於自己領域內的邏輯實現
這一方面使得開發邏輯更加清晰
專業化分工更加易於進行
另一方面
由於切面的隔離
降低了耦合性
我們就可以在不同的應用中將各個切面組合使用
從而使得代碼可重用性大大增強
AOP應用范圍
Authentication 權限
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 調試
logging
tracing
profiling and monitoring 記錄跟蹤 優化 校准
Performance optimization 性能優化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務
三Spring事務處理 Spring事務管理能給我們帶來什麼?
對於傳統的基於特定事務資源的事務處理而言(如基於JDBC 的數據庫訪問)
Spring並不會對其產生什麼影響
我們照樣可以成功編寫並運行這樣的代碼
同時
Spring還提供了一些輔助類可供我們選擇使用
這些輔助類簡化了傳統的數據庫操作流程
在一定程度上節省了工作量
提高了編碼效率
對於依賴容器的參數化事務管理而言
Spring則表現出了極大的價值
Spring本身也是一個容器
只是相對EJB容器而言
Spring顯得更為輕便小巧
我們無需付出其他方面的代價
即可通過Spring實現基於容器的事務管理(本質上來講
Spring的事務管理是基於動態AOP)
Hibernate in Spring
applicationContext
xml
<!
Hibernate SessionFactory
><bean id=
sessionFactory
class=
org
springframework
orm
hibernate
LocalSessionFactoryBean
>
<property name=
dataSource
><ref local=
dataSource
/></property>
<property name=
mappingResources
>
<list><!
Add list of
hbm
xml files here
>
<value>org/mzone/model/Tuser
hbm
xml</value>
<value>org/mzone/model/Article
hbm
xml</value>
</list>
</property>
<property name=
hibernateProperties
>
<props>
<prop key=
hibernate
dialect
>net
sf
hibernate
dialect
SybaseDialec</prop>
<prop key=
hibernate
show_sql
>True</prop>
</props>
</property>
</bean><!
Transaction manager for a single Hibernate SessionFactory (alternative to JTA)
>
<bean id=
transactionManager
class=
org
springframework
orm
hibernate
HibernateTransactionManager
>
<property name=
sessionFactory
><ref local=
sessionFactory
/></property>
</bean>
<bean id=
baseTxProxy
lazy
init=
true
class=
org
springframework
transaction
interceptor
TransactionProxyFactoryBean
>
<property name=
transactionManager
><ref bean=
transactionManager
/></property>
<property name=
target
>
<ref local=
userManagerTarget
/>
</property>
<property name=
transactionAttributes
>
<props>
<prop key=
save*
>PROPAGATION_REQUIRED</prop>
<prop key=
get*
>PROPAGATION_REQUIRED
readOnly</prop>
<prop key=
remove*
>PROPAGATION_REQUIRED</prop>
<prop key=
*
>PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id=
userManagerTarget
class=
org
mzone
service
impl
UserManagerImpl
>
<property name=
userDAO
><ref local=
userDAO
/></property>
<property name=
articleDao
><ref local=
articleDAO
/></property>
</bean>
UserDAO
java ArticleDAO
java
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
public void saveUser(Tuser user) {
getHibernateTemplate()
saveOrUpdate(user);
}}public class ArticleDAOImpl extends HibernateDaoSupport implements ArticleDAO {
public void saveArticle(Article article) {
getHibernateTemplate()
saveOrUpdate(article);
}}
HibernateDaoSupport
實現了HibernateTemplate和SessionFactory實例的關聯
HibernateTemplate對Hibernate Session操作進行了封裝
而HibernateTemplate
execute方法則是一封裝機制的核心
感興趣可以研究一下其實現機制
借助HibernateTemplate我們可以脫離每次數據操作必須首先獲得Session實例
啟動事務
提交/回滾事務以及煩雜的try/catch/finally的繁瑣操作
從而獲得以上代碼中精干集中的邏輯呈現效果
org
mzone
service
impl
UserManagerImpl
public class UserManagerImpl implements UserManager {
private UserDAO userDao;
private ArticleDAO articleDao;
public void saveUserAndArticle(Tuser user
Article article) {
userDao
saveUser(user);
articleDao
saveArticle(article);
}}
測試代碼
InputStream is = new FileInputStream(
applicationContext
xml
);
XmlBeanFactory factory = new XmlBeanFactory(is);UserManager userManager =
(UserManager )factory
getBean(
baseTxProxy
);
user = new Tuser();
article = new Article();
user
setUsername(
hellboys_topic
);
user
setPassword(
_topic
);
article
setTitle(
hellboys_topic
);
article
setContent(
hellboys_topic
);
userManager
saveUserAndArticle(user
article);
注意問題
UserManager userManager =
(UserManager )factory
getBean(
baseTxProxy
);UserManager userManager =
(UserManagerImpl) ctx
getBean(
baseTxProxy
);java
lang
ClassCastException
原因在於Spring的AOP實現機制
前面曾經提及
Spring中的事務管理實際上是基於動態AOP機制實現
為了實現動態AOP
Spring在默認情況下會使用Java DynamicProxy
但是
Dynamic Proxy要求其代理的對象必須實現一個接口
該接口定義了准備進行代理的方法
而對於沒有實現任何接口的Java Class
需要采用其他方式
Spring通過CGLib
實現這一功能
CGLib可以在運行期對Class行為進行修改
由於其功能強大
性能出眾
常常被作為Java Dynamic Proxy
之外的動態Proxy模式的實現基礎
在Spring
Hibernate中都用到了CGLib類庫
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28106.html