目录
1、什么是AOP
2、动态代理特点
1)基于接口
2、基于子类
3、AOP的细节
1)AOP的相关术语:
1、什么是AOP
把我们程序重复的代码抽取出来,在需要执行的时候,用动态代理技术,在不修改源码的基础上,对我们已有的方法进行增强。
2、动态代理特点
字节码随用随创建,随用随加载。
它与静态代理的区别在于,静态代理一上来就创建好,并加载
装饰者模式就是动态代理的体现
分类:基于接口、基于子类
作用:在不改变源代码的基础上对已有的方法进行加强
1)基于接口
创建代理对象的方法:newProxyInstance
方法参数:
ClassLoader:类加载器,和被代理对象使用相同的方法,该参数是固定写法。
Class[]:字节码数组,和被代理对象具有相同的行为,实现相同的接口,该参数是固定写法。
InvocationHandler:它是一个接口,提供增强的代码,该参数一般写成匿名内部类,并且它是策略模式的体现
ComputerFactory:
package proxy;
//电脑厂商
public class ComputerFactory implements IAgent{
//卖出
public void sale(double money) {
System.out.println("卖个消费者:"+money);
}
//售后服务
public void afterService(double money) {
System.out.println("给消费者提供售后服务:"+money);
}
}
IAgent:
package proxy;
//经销商,可能会代理多个厂家
public interface IAgent {
public void sale(double money);
public void afterService(double money);
}
Client:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//消费者
public class Client {
public static void main(String[] args) {
ComputerFactory cf = new ComputerFactory();
IAgent proxy = (IAgent) Proxy.newProxyInstance(cf.getClass().getClassLoader(),
cf.getClass().getInterfaces(),
new InvocationHandler() {
/*
* 该方法特征:
* 执行被代理对象的任何方法,都会进过此处,有拦截的特点
* 方法的参数:
* Object proxy:代理对象的引用
* Method method:当前执行的方法
* Object[] args:当前方法的参数
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
//获取正在执行方法的参数
double money = (double) args[0];
//判断正在执行的方法
if("sale".equals(method.getName())) {
//厂家售卖时要比进价时要高
obj = method.invoke(cf, money+2000);
}
if("afterService".equals(method.getName())) {
obj = method.invoke(cf, money+200);
}
return obj;
}
});
proxy.sale(5000);
proxy.afterService(600);
}
}
2、基于子类
创建对象的方法:create
方法的参数:
Class:被代理对象的字节码
Callback:如何代理
要求:被代理类不能是最终类
ComputerFactory:
package proxy;
//电脑厂商
public class ComputerFactory2{
//卖出
public void sale(double money) {
System.out.println("卖给消费者:"+money);
}
//售后服务
public void afterService(double money) {
System.out.println("给消费者提供售后服务:"+money);
}
}
Client
package proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//消费者
public class Client2 {
public static void main(String[] args) {
ComputerFactory2 cf = new ComputerFactory2();
ComputerFactory2 cf2 = (ComputerFactory2) Enhancer.create(cf.getClass(), new MethodInterceptor() {
/*
* 该方法特征:
* 执行被代理对象的任何方法,都会进过此处,有拦截的特点
* 方法的参数:
* Object proxy:代理对象的引用
* Method method:当前执行的方法
* Object[] args:当前方法的参数
* MethodProxy arg:它是当前执行方法的 代理对象
* */
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy arg) throws Throwable {
Object obj = null;
//获取正在执行方法的参数
double money = (double) args[0];
//判断正在执行的方法
if("sale".equals(method.getName())) {
//厂家售卖时要比进价时要高
obj = method.invoke(cf, money+2000);
}
if("afterService".equals(method.getName())) {
obj = method.invoke(cf, money+200);
}
return obj;
}
});
cf2.sale(5000);
cf2.afterService(400);
}
}
3、AOP的细节
1)AOP的相关术语:
Joinpoint(连接点):程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。
Pointcut(切入点):可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点
所有的切入点都是连接点,但是所有的连接点不都是切入点。
Advice(通知 / 增强): AOP框架在特定的切入点执行的增强处理,称为通知。如果做的事是公共类,则称公共类为通知类,通知类中的方法为通知方法。
通知类型:
Target(目标对象):代理的目标对象。
Weaving(织入):把增强应用到目标对象来创建新的代理对象的过程。
Proxy(代理):一个类被AOP织入增强后,就产生一个结果的代理类。
Aspect(切面):是切入点和通知的结合。