課程
/后端開發(fā)
/Java
/Spring入門篇
想問下advisors例子中,order在切面類中并無實際運用,他的實際作用是什么呢
2016-04-18
源自:Spring入門篇 5-7
正在回答
Spring中的事務(wù)是通過aop來實現(xiàn)的,當我們自己寫aop攔截的時候,會遇到跟spring的事務(wù)aop執(zhí)行的先后順序問題,比如說動態(tài)切換數(shù)據(jù)源的問題,如果事務(wù)在前,數(shù)據(jù)源切換在后,會導(dǎo)致數(shù)據(jù)源切換失效,所以就用到了Order(排序)這個關(guān)鍵字.
? ? ? ?我們可以通過在@AspectJ的方法中實現(xiàn)org.springframework.core.Ordered 這個接口來定義order的順序,order 的值越小,說明越先被執(zhí)行。
比如代碼如下:
/**?*?aop面向切面編程?*?*/@Component@Aspectpublic?class?AspectJ4DataBase?implements?Ordered{ //攔截所有的service操作 @Pointcut("execution(?*?com.hc.shop.*.service.*.*(..))") public?void?readMethod()?{ }//?匹配所有的讀取操作 @Before("readMethod()") public?void?onlyReadPre(){ DataSourceContextHolder.setDataSourceType(DataSourceType.MYSQL); System.out.println("數(shù)據(jù)庫切換MYSQL"); } @After("readMethod()") public?void?onlyReadPast(){ DataSourceContextHolder.setDataSourceType(DataSourceType.ORACLE); System.out.println("數(shù)據(jù)庫切換回ORACLE"); } @Override public?int?getOrder()?{ //?TODO?Auto-generated?method?stub return?1; }}
????在事務(wù)配置的地方也配置order 字段,代碼如下:
????
<!--?注解方式配置事物?--><tx:annotation-driven?transaction-manager="transactionManager"?order="2"/>
這樣就實現(xiàn)了我們自己寫的aop在事務(wù)介入之前就執(zhí)行了!
舉報
為您帶來IOC和AOP的基本概念及用法,為后續(xù)高級課程學習打下基礎(chǔ)
3 回答advisor
2 回答advisor演示的invoker和invokerExcep方法
2 回答老師order屬性來定義在哪里找啊,我對order屬性來定義advisor順序不是很理解啊!能解釋一下嗎
1 回答講的advisor但是后面的例子里邊配置的不是advisor只是around的事務(wù)的例子啊
2 回答老師這例子跟advisor有關(guān)系嗎?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學習伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2016-08-25
Spring中的事務(wù)是通過aop來實現(xiàn)的,當我們自己寫aop攔截的時候,會遇到跟spring的事務(wù)aop執(zhí)行的先后順序問題,比如說動態(tài)切換數(shù)據(jù)源的問題,如果事務(wù)在前,數(shù)據(jù)源切換在后,會導(dǎo)致數(shù)據(jù)源切換失效,所以就用到了Order(排序)這個關(guān)鍵字.
? ? ? ?我們可以通過在@AspectJ的方法中實現(xiàn)org.springframework.core.Ordered 這個接口來定義order的順序,order 的值越小,說明越先被執(zhí)行。
比如代碼如下:
/**
?*?aop面向切面編程
?*
?*/@Component@Aspectpublic?class?AspectJ4DataBase?implements?Ordered{
//攔截所有的service操作
@Pointcut("execution(?*?com.hc.shop.*.service.*.*(..))")
public?void?readMethod()?{
}//?匹配所有的讀取操作
@Before("readMethod()")
public?void?onlyReadPre(){
DataSourceContextHolder.setDataSourceType(DataSourceType.MYSQL);
System.out.println("數(shù)據(jù)庫切換MYSQL");
} @After("readMethod()")
public?void?onlyReadPast(){
DataSourceContextHolder.setDataSourceType(DataSourceType.ORACLE);
System.out.println("數(shù)據(jù)庫切換回ORACLE");
} @Override
public?int?getOrder()?{ //?TODO?Auto-generated?method?stub
return?1;
}
}
????在事務(wù)配置的地方也配置order 字段,代碼如下:
????
<!--?注解方式配置事物?--><tx:annotation-driven?transaction-manager="transactionManager"?order="2"/>
這樣就實現(xiàn)了我們自己寫的aop在事務(wù)介入之前就執(zhí)行了!