天天看点

Spring—— 初识AOP1、什么是AOP2、动态代理特点3、AOP的细节

目录

1、什么是AOP

2、动态代理特点

1)基于接口

2、基于子类

3、AOP的细节

1)AOP的相关术语:

1、什么是AOP

把我们程序重复的代码抽取出来,在需要执行的时候,用动态代理技术,在不修改源码的基础上,对我们已有的方法进行增强。

2、动态代理特点

字节码随用随创建,随用随加载。

它与静态代理的区别在于,静态代理一上来就创建好,并加载

装饰者模式就是动态代理的体现

分类:基于接口、基于子类

作用:在不改变源代码的基础上对已有的方法进行加强

1)基于接口

Spring—— 初识AOP1、什么是AOP2、动态代理特点3、AOP的细节

创建代理对象的方法: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);
		
	}

}
           
Spring—— 初识AOP1、什么是AOP2、动态代理特点3、AOP的细节

2、基于子类

创建对象的方法:create

方法的参数:

Class:被代理对象的字节码

Callback:如何代理

要求:被代理类不能是最终类

Spring—— 初识AOP1、什么是AOP2、动态代理特点3、AOP的细节
Spring—— 初识AOP1、什么是AOP2、动态代理特点3、AOP的细节

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框架在特定的切入点执行的增强处理,称为通知。如果做的事是公共类,则称公共类为通知类,通知类中的方法为通知方法。

                          通知类型:

Spring—— 初识AOP1、什么是AOP2、动态代理特点3、AOP的细节

Target(目标对象):代理的目标对象。

Weaving(织入):把增强应用到目标对象来创建新的代理对象的过程。

Proxy(代理):一个类被AOP织入增强后,就产生一个结果的代理类。

Aspect(切面):是切入点和通知的结合。