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