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