Spring AOP 架構
Spring AOP 架構的核心是建立在代理上的。Spring 內部有兩種實現代理的方法:JDK動態代理和CGLIB代理。
1 Spring 中的聯結點
Spring 只支持一種聯結點:方法調用。
2 Spring 中的方面
在Spring AOP 中,一個方面是由一個實現了Advisor(通知者)接口的類表示的。兩個子接口:
IntroductionAdvisor 引入通知者(控制對哪些類實施引入)
PointcutAdvisor 切入點通知者
3 關於ProxyFactory 類
ProxyFactory 類控制着Spring AOP中的織入和創建代理的過程,控制哪些方面需要織入到代理中去。
4 在 Spring 中創建通知
Spring 支持五種通知:
前置通知 MethodBeforeAdvice
後置通知 AfterReturningAdvice
包圍通知 MethodInterceptor
拋出通知 ThrowAdvice
引 入 IntroductionInterceptor
示例程序說明:
演示前置通知與後置通知
package cuigh.spring.aop.step01;
/*
* 功能:演示在代理類中是否可以知道參數的類型
* */
public class User {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package cuigh.spring.aop.step01;
/*
* 功能:目標類
* */
public class MessageWriter {
public void writeMessage(String name){
System.out.print(" World ");
}
public void writeMessage2(User user){
System.out.print("World 2 ");
}
}
package cuigh.spring.aop.step01;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class MyBeforeAdvice implements MethodBeforeAdvice {
/**
* 功能:前置通知
*/
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("方法執行前通知,方法名稱="+method.getName()+"\n");
System.out.println("參數類型="+args[0].getClass().getName());
}
}
package cuigh.spring.aop.step01;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
/**
* 功能:後置通知
*/
public class MyAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println("方法執行後增加邏輯,方法名="+method.getName());
}
}
package cuigh.spring.aop.step01;
import org.springframework.aop.framework.ProxyFactory;
public class AdviceExample {
/**
* 功能:演示前置、後置通知
*/
public static void main(String[] args) {
//創建目標類與通知類
MessageWriter target = new MessageWriter();
MyBeforeAdvice advice = new MyBeforeAdvice();
ProxyFactory pf = new ProxyFactory();
pf.addAdvice(advice);
pf.setTarget(target);
MessageWriter proxy = (MessageWriter)pf.getProxy();
proxy.writeMessage("zhang");
System.out.println("\n--------------");
proxy.writeMessage2(new User());
System.out.println("增加方法執行後的邏輯-------------------");
//創建第二個通知類
MyAfterReturningAdvice advice2 = new MyAfterReturningAdvice();
pf.addAdvice(advice2);
proxy.writeMessage("after");
}
}
程序輸出:
方法執行前通知,方法名稱=writeMessage
參數類型=java.lang.String
World
--------------
方法執行前通知,方法名稱=writeMessage2
參數類型=cuigh.spring.aop.step01.User
World 2 增加方法執行後的邏輯-------------------
方法執行前通知,方法名稱=writeMessage
參數類型=java.lang.String
World 方法執行後增加邏輯,方法名=writeMessage