AOP
代理模式
需求:在核心业务代码外,添加其他代码,且重复调用
使用代理函数调用核心业务代码,达到在核心代码前后添加其他代码的目的。
静态代理:
1对1代理,每个类和每个函数都要写对应的代理
动态代理:
使用反射机制
jdk动态代理
必须有接口,最终生成的代理类在com.sun.proxy包下,类名为$proxy1 $proxyN
package com.darkpar.spring.Proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; public class ProxyFactory { private Object target; public ProxyFactory(Object target){ this.target=target; } public Object getProxy(){ ClassLoader classLoader = target.getClass().getClassLoader(); Class<?>[] interfaces = target.getClass().getInterfaces(); InvocationHandler invocationHandler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; try { System.out.println(method.getName()+"参数:"+ Arrays.toString(args)); result=method.invoke(target,args); System.out.println(method.getName()+"结果:"+ result); } catch (Exception e) { System.out.println(method.getName()+"异常:"+ e.getMessage()); throw new RuntimeException(e); } finally { System.out.println(method.getName()+"结束"); } return result; } }; return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler); } }
其中classLoader是类加载器,interfaces是target所实现的所有接口,invocationHandler中invoke是对被代理的函数所执行的操作
proxyFactory是代理工厂,可以生成target类的代理类,生成的代理类为com.sun.proxy.$Proxy0
这种实现利用了reflect反射包中的Proxy类,封装了反射,比我想的简单很多,我还以为要自己操作每个函数级别的反射。
类加载器:
根类加载器
扩展类加载器
应用类加载器(程序员写的一般都用这个加载)
自定义类加载器
cglib动态代理
最终生成的代理类会集成目标类,并且和目标类在相同包下。
AOP概念
Aspect Oriented Programming 是一种设计思想,指面向切面编程,是面向对象编程的一种补充和完善。
它通过预编译方式和运行期动态代理方式实现 在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。

其中,OOP指的是类与类之间的继承关系,纵向由上而下的添加,子类在继承父类已有的东西的同时添加或重写功能。
AOP是横向,为指定的核心代码的前后等周围位置,添加特定的功能。
分别表示纵向和横向的思想。
AOP术语
横切关注点
多个方法抽取不同的非核心业务,每个这种方法都是一个横切关注点。可以使用多个横切关注点对核心代码进行不同方面的增强。
通知
需要把横切关注点封装到一个类中,这个类就叫做一个切面,被封装的每一个横切关注点都叫做一个通知。
通知种类
切面
封装通知方法的类
目标
被代理的对象叫做目标对象
代理
为目标对象应用通知之后创建的代理对象
连接点
逻辑概念,目标方法中对应的可以被通知的位置叫做连接点
切入点
定位连接点的方式,即应该把哪个横切关注点放到切面中的哪个时刻
emmm,突然想到的
感觉AOP还是有局限性,不知道后面的课有没有讲到新的方法
对于需要横向关注的方法来说,需要被包裹或代理执行,如果是多层次的,还是会有很多的代码需要同时修改。
浙公网安备 33010602011771号