AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程(也叫面向方面),可以通過先行編譯方式和運行期動態代理實現在不修改原始碼的情況下給程式動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。
首先我們寫一個介面。
因為所有aop執行個體代理的都是介面。
DemoInterface.Java
packagecom.fish;
public
interface DemoInterface {
public
abstract String getName();
public
abstract void sava(String myName);
public
abstract void update(String myName, String heName);
}
然後寫一個對該介面的執行個體
packagecom.fish.impl;
importcom.fish.DemoInterface;
public
class Demo implements DemoInterface {
public String getName() {
return
"fish";
}
public
void sava(String myName) {
System.out.println("這是一個儲存方法");
}
public
void update(String myName, StringheName) {
System.out.println("這是一個更新方法");
}
}
接著我們寫一個普通的java類,用作代理
packagecom.fish.aop;
public
class MyAop {
public
void myMthod1(){
System.out.println("前置通知");
}
public
void myMthod2(){
System.out.println("後置通知");
}
public
void myMthod3(){
System.out.println("最終通知");
}
}
下面我們在xml配置
Spring.xml
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy
/> //首先開啟代理aop
<bean
id="demo"class="com.fish.impl.Demo"></bean>
//執行個體化兩個類
<bean
id="myAop"class="com.fish.aop.MyAop"></bean>
//執行個體化兩個類
<aop:config>
//對aop的註冊
<aop:aspect
id="asp"
ref="myAop">
//寫一個切面,ref關聯的是代理類
<aop:pointcut
expression="execution(* com.fish.impl.Demo.*(..))"//攔截是的要代理的目的對象,com前面的*是代表要攔截所有com。FISH包下的類,第二個*表示demo裡面的所有方法,()裡面是方法的參數。
id="mycut"/>
<aop:before
method="myMthod1"
pointcut-ref="mycut"/>
//然後在before代表在切入點之前執行代理函數mymthod1方法的內容。
<aop:aftermethod="myMthod2" pointcut-ref="mycut" />//有前就有後,所以在地理目標對象的後面。切入。然後還有很多狀態。
</aop:aspect>
</aop:config>
</beans>
下面我寫一個測試類別
Test.Java
packagecom.fish;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
public
class Test {
public
static void main(String[] args) {
ApplicationContext context= new ClassPathXmlApplicationContext("spring.xml");
DemoInterface demo=(DemoInterface) context.getBean("demo");//這裡代理的是介面,要不會報類型轉化異常的錯誤哦。不是demo而是DemoInterface介面。
demo.sava("aa");
}
}
所以我們可以看到結果是:
前置通知
這是一個儲存方法
後置通知
從這個我們就可以知道,執行的順序。Aop其實就是一種動態代理。對於23中設計模式的代理模式我就不說了。