AOP 主要應用場景有:java
1. Authentication 權限express
2. Caching 緩存編程
3. Context passing 內容傳遞segmentfault
4. Error handling 錯誤處理緩存
5. Lazy loading 懶加載性能優化
6. Debugging 調試ide
7. logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準模塊化
8. Performance optimization 性能優化性能
9. Persistence 持久化學習
10. Resource pooling 資源池
11. Synchronization 同步
12. Transactions 事務
-->AOP:(Aspect Orinted Programming)面向切面編程,用於具備橫切邏輯的場合,如:訪問控制,事務管理,性能檢測,由切入點和加強處理組成。
AOP主要核心是:在什麼位置(pointcut:切入點)執行什麼功能(advice:加強處理),AOP在Java裏是利用反射機制實現,
關鍵詞:
-->Aspect(切面):一個模塊化的橫切邏輯,相似於 Java 中的類聲明。
-->Join Point(鏈接點):原程序執行過程當中的某一個點,構造方法調用,字段的設置和獲取,方法的調用,方法的執行,異常的處理執行,類的初始化。好比方法1-->方法2-->方法3,此時方法2能夠稱做一個鏈接點
-->Advice(加強處理):在鏈接點上執行的代碼邏輯,Advice 定義了在 Pointcut
裏面定義的程序點具體要作的操做,它經過 before、after 和 around 來區別是在每一個 joint point 以前、以後仍是代替執行的代碼。eg:在2的先後加上日誌輸出
-->Pointcut(切入點):對鏈接點的描述,即匹配的條件,它定義了相應的 Advice 將要發生的地方,eg:假如符合2鏈接點的某一個特徵,執行加強程序
-->Target Object(目標對象):被切面加強的對象
-->Weaving(織入):執行加強處理程序的過程
xml文件配置實現方式:
1 <!-- 註解方式配置事物 --> 2 <tx:annotation-driven transaction-manager="transactionManager" /> 3 <bean class="com.one.ssm.impl.aopTest.UserServiceLogger" /> 4 <aop:aspectj-autoproxy/> 5 注意:須要在配置文件中加入<aop:aspectj-autoproxy/>就能夠啓用對@AspectJ註解的支持 6 <!--Aop配置實例--> 7 <bean id="thLogger" class="com.one.ssm.impl.aopTest.UserServiceLogger"></bean> 8 <aop:config> 9 <aop:pointcut id="pointcut" expression="execution(public void *(..))"></aop:pointcut> 10 <aop:aspect ref="thLogger"> 11 <!--前置加強--> 12 <aop:before method="before" pointcut-ref="pointcut"/> 13 <!--後置加強--> 14 <aop:after-returning returning="result" method="afterRunning" pointcut-ref="pointcut"/> 15 <!--異常拋出加強--> 16 <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/> 17 <!--實現最終加強,不管如何都要執行,至關於finally--> 18 <aop:after method="afterLogger" pointcut-ref="pointcut"/> 19 <!--實現環繞加強,經過方法名爲ProceedingJoinPoint類型的參數獲取鏈接點的信息 20 她的proceed()方法能夠調用真正的目標方法,實現對鏈接點的徹底控制--> 21 <aop:around method="aroundLogger" pointcut-ref="pointcut"/> 22 </aop:aspect> 23 </aop:config>
註解實現方式:
1 @Aspect //將UserServiceLogger 定義爲切面 2 public class UserServiceLogger { 3 private static final Logger log=Logger.getLogger("UserServiceLogger.class"); 4 5 @Before("excution(*service.UserService.*(..))")//將before()方法定義爲前置加強 6 public void before(JoinPoint jp){ 7 log.info("前置加強:調用"+jp.getSignature().getName().toString()+"的方法執行," + 8 "方法入參:"+Arrays.toString(jp.getArgs())); 9 } 10 @ afterRunning("excution(*service.UserService.*(..))" returning =result) //表明將afterRunning()方法定義爲後置加強 11 public void afterRunning(JoinPoint jp,Object result){ 12 log.info("後置加強"+jp.getSignature().getName().toString()+"的方法執行"+ 13 "方法入參:"+Arrays.toString(jp.getArgs())); 14 } 15 //異常拋出加強 16 public void afterThrowing(JoinPoint jp,RuntimeException e){ 17 log.info(jp.getSignature().getName().toString()+"方法異常爲:"+e); 18 } 19 //最終加強 20 public void afterLogger(JoinPoint jp){ 21 log.info(jp.getSignature().getName().toString()+"方法結束執行。"+ 22 "方法入參:"+Arrays.toString(jp.getArgs())); 23 } 24 //環繞加強 25 public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable { 26 log.info("調用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+"方法。方法入參:" 27 + Arrays.toString(jp.getArgs())); 28 try { 29 //執行目標方法並得到返回值 30 Object result=jp.proceed(); 31 log.info("調用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+result); 32 return result; 33 } catch (Throwable e) { 34 log.info(jp.getSignature().getName().toString()+"方法發生異常"+e); 35 throw e; 36 }finally { 37 log.info(jp.getSignature().getName().toString()+"方法結束執行"); 38 }
execution() 表達式的主體;
第一個」*「符號 表示返回值的類型任意;
包名後面的」..「 表示當前包及子包
第二個」*「 表示類名 表示全部類。
.*(..) 表示任何方法名, 括號表示參數,兩個點表示任何參數類型
基本語法格式爲:
execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數模式>)<異常模式>?) 除了返回類型模式、方法名模式和參數模式外,其它項都是可選的。
execution(public * *(..)):任意公共方法的執行
execution(* *To(..)):匹配目標類全部以To爲後綴的方法
execution(* com.xyz.service.AccountService.*(..)) :定義在service包裏的任意方法的執行
execution(* com.xyz.service.*.*(..)) :定義在service包和全部子包裏的任意類的任意方法的執行:
execution(* com..*.*Dao.find*(..)) :匹配包名前綴爲com的任何包下類名後綴爲Dao的方法,方法名必須以find爲前綴
execution(* joke(String,..))):匹配目標類中的joke()方法,該方法第 一個入參爲String,後面能夠有任意個入參且入參類型不限,如joke(String s1)、joke(String s1,String s2)和joke(String s1,double d2,Strings3)都匹配
l其餘相關AOP連接:http://www.javashuo.com/article/p-mcrbztoz-bn.html
以上內容我的學習所得,僅供參考!!!