?? 15. spring note.txt
字號:
實施:
1) 創建攔截器類,封裝代理行為
implements MethodInterceptor
2) 使用 ProxyFactoryBean 產生代理
屬性:
target 目標對象e
proxyInterfaces 代理的接口
interceptorNames 代理要干什么
補充:Advice / Interceptor
除了 MethodInterceptor,還有多種接口可供選擇
決定攔截方法的時機
方法前攔截 MethodBeforeAdvice
方法后攔截 AfterReturningAdvice
方法拋出異常后攔截 ThrowsAdvice
圍繞方法攔截 MethodInterceptor
MethodInterceptor 通用
Pointcut
切點,相當于過濾器,縮小攔截的方法的范圍
概要:
縮小接口或類的范圍
縮小方法的范圍
實施
1) implements Pointcut
定制過濾規則
ClassFilter
站在接口或類的級別上縮小范圍
MethodMatcher
站在方法的級別上所有范圍
isRuntime()
return true ,意味著要對參數的值做判斷,會調用有三個參數的matchs方法
2) 把 pointcut 和 advice 組合成一個 advisor 對象
advisor = pointcut + advice
使用 DefaultPointcutAdvisor(org.springframework.aop.support.DefaultPointcutAdvisor) 構造 advisor 對象
3) 然后把 advisor 添加到 interceptorNames 中
使用 Spring 提供的Advisor實現
1)NameMetchMethodPointcutAdvisor()
1)RegexpMethodPointcutAdvisor()
思考:使用 ProxyFactoryBean 創建代理的缺點??
1)每個target都要聲明ProxyFactoryBean真麻煩!!!
2)能不能以自動匹配的形式創建代理
可以!!!使用自動代理創建器
BeanNameAutoProxyCreator(org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator)
為指定的 bean 自動創建代理
屬性:
beanNames
interceptorNames
DefaultAdvisorAutoProxyCreator(org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator)
根據 Advisor 創建代理
day4
四、使用AOP管理事務
帳戶管理
Account
IAccountDao
long open(String name,double init);
withdraw(long id,double amount);
deposit(long id,double amount);
List<Account> findByName(String name)
JdbcAccountDao
applicationContex.xml
提供數據源,注入給DAO
實踐經驗:
Dao 中定義的方法是持久化單元操作,
一個事務可能有若干個單元操作構成,
所以事務邏輯不應該出現在Dao中。
通常事務邏輯應用在業務層(service層)
采用 AOP 管理事務
JdbcTransactionManager implements MethodInterceptor
問題:
1)事務管理器與Dao 都操作同一個連接對象
2)同時,要保證在每個線程都操作不同的連接對象
解決方法:采用ThreadLocal 管理連接對象
創建模板類
管理資源(連接對象)的獲取釋放
執行SQL
JDBCTemplate
update(String sql,Object[] args);
List<Map> query(String sql);
結論:事務管理棘手
資源的管理棘手
五、對Jdbc的支持
1.提供了JdbcTemplate 簡化編程
2.提供了聲明的事務管理(與編程的事務管理)
不再把事務邏輯硬編碼在程序中,而是在配置文件中定義事務邊界
3.把所有checkedException ---> uncheckedException
SQLException--->DataAccessException
應用步驟:
Account
IAccountDao
long open(String name,double amount);
void deposit(long id,double amount);
void withdraw(long id,double amount);
List<Account> findByName(String name);
JdbcAccountDao extends JdbcDaoSupport
繼承了兩個方法:
setDataSource(DataSource ds)
getJdbcTemplate()
Test
applicationContext.xml
datasource(org.springframework.jdbc.datasource.DriverManagerDataSource)
driverClassName
url
username
password
dao
transactionManager(org.springframework.jdbc.datasource.DataSourceTransactionManager)
dataSource
transactionProxy(org.springframework.transaction.interceptor.TransactionProxyFactoryBean)
target
transactionManager
transactionAttributes
事務的傳播屬性,七種
調用者:調用當前方法的方法
當前方法:聲明事務屬性的方法
PROPAGATION_REQUIRED:如果存在一個事務,則支持當前事務。
如果沒有事務則開啟一個新的事務。
PROPAGATION_SUPPORTS: 如果存在一個事務,支持當前事務。
如果沒有事務,則非事務的執行。
PROPAGATION_MANDATORY: 如果已經存在一個事務,支持當前事務。
如果沒有一個活動的事務,則拋出異常。
PROPAGATION_REQUIRES_NEW: 總是開啟一個新的事務。
如果一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_NOT_SUPPORTED: 總是非事務地執行,并掛起任何存在的事務。
PROPAGATION_NEVER: 總是非事務地執行,如果存在一個活動事務,則拋出異常
PROPAGATION_NESTED: 如果一個活動的事務存在,則運行在一個嵌套的事務中.
如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行
JdbcTemplate
JdbcTemplate 的API
更新
查詢
如果使用Spring 提供的事務管理器 , 你必須使用 Template
六、Spring對 Hibernate 的支持
1) HibernateTemplate
2) 提供聲明的事務管理
3) LocalSessionFactoryBean(org.springframework.orm.hibernate3.LocalSessionFactoryBean)
dataSource
應用的步驟(與JDBC有三點不同)
1)HibernateAccountDao extends HibernateDaoSupport
setSessionFactory()
getHibernateTemplate()
2)事務管理器使用 HibernateTransactionManager(org.springframework.orm.hibernate3.HibernateTransactionManager)
3)使用 LocalSessionFactoryBean 獲得SessionFactory
1.SpringDAO,SpringORM給持久層帶來的好處: 省去try catch代碼,事務、異常自動處理
2.訪問數據源的兩種方法(b/s,c/s): dataSource: JDBC Driver JNDI
7.事務的五個屬性: 傳播性、只讀、
day5Struts1.x流程: B(瀏覽器)---->ActionServlet-->RequestProcessor-->Action-->JavaBean-->DB request ↓ <-- <-- <-- struts-config.xml
七、在web 應用中使用Spring
概述:
Spring 提供監聽器,在應用部署時構造ApplicationContext
ApplicationContext 對象會被綁定在 servlet context 中
Spring 提供了API獲得servlet context 中的ApplicationContext
實施步驟:
實現一個web應用,區分 mvc 。
然后,使用spring 管理model :
1) 配置監聽器加載上下文
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2) 在Servlet中獲得上下文
WebApplicationContext context=
WebApplicationContextUtils
.getWebApplicationContext(this.getServletContext());
-------------------------
八、對Struts 的支持
輔助 Action 獲得 model 對象
兩種選擇:
Action 不受Spring 管理
Spring為Action 獲得 applicationContext 提供支持
Action 受 Spring 管理,
容器為Action注入依賴的 model 對象
使用Spring 的RequestProcessor 或 Action 代理實現
與Struts 集成的兩種選擇:
1 spring 不管理Action
那只需要關注 Action 怎樣獲得上下文,兩種方式可選擇
1) 仍然通過 WebApplicationContextUtils 獲得
WebApplicationContextUtils.getWebApplicationContext(
this.getServlet().getServletContext());
2)XxAction extends ActionSupport
繼承了一個方法 :getWebApplicationContext
令外可選擇 :
DispatchActionSuport
LookupDispatchActionSupport
MappingDispatchActionSupport
優點:結構清楚簡單,容易理解
2 讓 Spring 管理 Action
把 Action 做為 bean 配置
這樣就可以注入Action 依賴的 model 對象了
實現機制,有兩種:
改變 RequestProcessor 創建 Action的行為
改由上下文中獲得 action
原理:覆蓋 processActionCreate
所有請求都給一個特殊的Action,
此 Action execute 方法由上下文中獲得 action
然后把處理行為委托給action
return action.execute()
Spring 給我們提供了這兩種機制的實現
實施:
1) 把 Action 作為bean 配置,注入其依賴的model組件
applicationContext.xml :
<bean name="/actionpath" class="action class">
<property name="foo">
<ref bean="foo"/>
</property>
</bean>
struts-config.xml :
<action name="/actionpath" type="action class"/>
type 無效
即,等價于:
<action name="/actionpath" />
2) 選擇 RequestProcessor 或者 Action ,
使其委托請求給 spring 管理的bean
A)使用DelegatingRequestProcessor
<controller processorClass=
"org.springframework.web.struts.DelegatingRequestProcessor"/>
B)使用 Action 的代理 DelegatingActionProxy
<action path="/actionpath"
type="org.springframework.web.struts.DelegatingActionProxy"/>
Spring Security(安全) 比較JAAS與SpringSecurity JAAS SpringSecurity 與具體的 web容器有關 與具體web容器無關(技術:IOC/AOP)
推薦書籍(學完這課程之后再看):Spring2.x(2.0/2.5)實例指南Spring2企業級開發(圖靈出版社)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -