首先,儘管咱們這裏不乏技術牛人,但是爲了照顧剛接觸JAVA沒多久的童鞋,我先來普及Spring AOP是什麼。
AOP其實是對OOP思想的補充和完善。我想大家對OOP都不會陌生,OOP引入"抽象"、"封裝"、"繼承"、"多態"等概念,對萬事萬物進行抽象和封裝,來建立一種對象的層次結構。它強調了一種完整事物的自上而下的關係。但是具體細粒度到每個事物內部,OOP就顯得無能爲力了。
如日誌功能。日誌代碼往往水平地散佈在所有對象層次當
中,卻與它所散佈到的對象的核心功能毫無關係。對於其他很多類似功能,如事務管理、權限控制等也是如此。這導致了大量代碼的重複,而不利於各個模塊的重
用。
而AOP技術則恰恰相反,它利用一種稱爲"橫切"的技術,能夠剖解開封裝的對象內部,並將那些影響了多個類並且與具體業務無關的公共行爲 封裝成一個獨立的模塊(稱
爲切面)。更重要的是,它又能以巧奪天功的妙手將這些剖開的切面復原,不留痕跡的融入核心業務邏輯中。這樣,對於日後橫切功能的編輯和重用都能夠帶來極大的方便。
一個實際工作中遇到的例子,
我在A環節提交一個表單,給下個B環節來審覈,但是,因爲之前規定,如果在每月15號之後,則不能提交, 我們通常的做法是在提交表單的方法中做這個檢查,
但是,如果這些不同的提交方法 都要在提交前做檢查,未免太重複了,加重了工作量,也造成代碼的冗餘,所以我們一用到AOP ,對要提交的方法 在具體執行前,做個方法前通知,來檢查是不是滿足規定就好,如果不滿足,則拋出異常,前臺捕獲,不能提交了於是。
下面講一個簡單的通過XML文件來對AOP做個實現。
在spring配置文件上配置如下代碼
<bean id="myAdvisor" class="org.qin.yinglian.system.web.CodeAOPTest">
</bean>
<aop:config>
<!-- 切點 -->
<aop:pointcut id="servicePointcut"
expression="execution(* org.qin.yinglian.basic.service.*.*(..))" />
<!-- 切面(切點+通知) -->
<aop:aspect id="serviceAspect" ref="myAdvisor">
<!-- 執行的切面方法 -->
<aop:before method="beforeAdviso" pointcut-ref="servicePointcut" />
</aop:aspect>
</aop:config>
通知類:
package org.qin.yinglian.system.web;
public class CodeAOPTest {
// 前置通知
public void beforeAdvisor() {
System.out.println("Hello");
}
}