没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、 什么是 AOP
AOP Aspect Oriented Programing 面向切面编程 , 人们说 AOP 是对 OOP (面向对象编
程)思想一个延伸
AOP 采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安
全检查、缓存)
**** AOP 面向切面编程 底层原理 代理!!!
相关术语
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为
spring 只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置
通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运
行期为类动态地添加一些方法或 Field.
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.
spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入
Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类
Aspect(切面): 是切入点和通知(引介)的结合
二、 AOP 的底层实现
AOP 底层使用的代理技术 : JDK 动态代理 和 CGlib 的动态代理
1、 JDK 动态代理
原理: 针对内存中 Class 对象,使用类加载器 动态为目标对象实现接口的创建代理类
* 代理类 是动态创建的, 代理类 和 被代理对象 实现相同接口
* 被代理对象 必须要实现 接口 (JDK 代理 只能针对接口 进行代理 )
public class MyJDKProxy implements InvocationHandler {
private UserDAO userDAO;// 被代理对象
// 通过被代理对象 构造 代理类对象
public MyJDKProxy(UserDAO userDAO) {
this.userDAO = userDAO;
}
/**
* 使用 JDK 进行 动态代理
*
* @param userDAO
* 被代理对象
* @return
*/
public UserDAO createJDKProxy() {
return (UserDAO) Proxy.newProxyInstance(userDAO.getClass()
.getClassLoader(), userDAO.getClass().getInterfaces(), this);
}
@Override
// 访问被代理对象 任何方法,都和执行 invoke
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 针对 add 方法进行 增强,记录日志 ...
if (method.getName().equals("add")) {// 如果访问方法 是 add 方法
System.out.println("记录日志....");
// 调用目标方法
return method.invoke(userDAO, args);
} else {
// 其它方法
return method.invoke(userDAO, args);
}
}
}
2、 使用 CGlib 完成动态代理
* JDK 动态代理原理, 为目标对象 接口生成代理对象 ,对于不使用接口的业务类,
无法使用 JDK 动态代理
CGLIB(Code Generation Library)是一个开源项目!
是一个强大的,高性能,高质量的 Code 生成类库,它可以在运行期扩展 Java 类与实现 Java
接口。Hibernate 支持 CGlib 来实现 PO 字节码的动态生成。
* Hibernate 默认 PO 字节码生成技术 javassist
CGLIB 是一个第三方技术,使用时 ,需要下载 jar 包
http://sourceforge.net/projects/cglib/
* Spring3.2 版本, spring-core jar 包 已经集成 cglib 开发类
原理 : CGlib 采用非常底层字节码技术,可以为一个类创建子类,解决无接口代理问题
public class MyCglibProxy implements MethodInterceptor {
// 目标对象
private ProductDAO productDAO;
// 通过构造器 传入被代理对象
public MyCglibProxy(ProductDAO productDAO) {
this.productDAO = productDAO;
}
// 创建代理
public ProductDAO createCglibProxy() {
// 创建代理核心对象
Enhancer enhancer = new Enhancer();
// 设置被代理类 (为类创建子类)
enhancer.setSuperclass(productDAO.getClass());
// 设置回调函数
enhancer.setCallback(this);
// 返回代理 (返回代理子类对象)
return (ProductDAO) enhancer.create();
}
@Override
// 被代理对象所有方法执行 ,都会调用 intercept 方法
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
// 为 addProduct 计算运算时间
if (method.getName().equals("addProduct")) {// 当前执行方法
long start = System.currentTimeMillis();
Object result = methodProxy.invokeSuper(proxy, args);
long end = System.currentTimeMillis();
System.out.println("addProduct 方法运行时间 : " + (end - start));
return result;
} else {
// 不进行增强
return methodProxy.invokeSuper(proxy, args);
}
}
}
结论:
1).若目标对象实现了若干接口,spring 使用 JDK 的 java.lang.reflect.Proxy 类代理。
2).若目标对象没有实现任何接口,spring 使用 CGLIB 库生成目标对象的子类
程序中应优先对接口创建代理,便于程序解耦维护
三、 Spring AOP
AOP 开发规范 : AOP 联盟为通知 Advice 定义了 org.aopalliance.aop.Interface.Advice
Spring AOP 实现 AOP 联盟定义 规范
1、 传统 Spring AOP 提供 五类 Advice
前置通知(代码增强) org.springframework.aop.MethodBeforeAdvice
* 在目标方法执行前实施增强
后置通知 org.springframework.aop.AfterReturningAdvice
* 在目标方法执行后实施增强
环绕通知 org.aopalliance.intercept.MethodInterceptor
* 在目标方法执行前后实施增强
异常抛出通知 org.springframework.aop.ThrowsAdvice
* 在方法抛出异常后实施增强
剩余13页未读,继续阅读
资源评论
paterWang
- 粉丝: 1061
- 资源: 1241
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于MIC+NE555光敏电阻的声光控电路Multisim仿真原理图
- python tkinter-08-盒子模型.ev4.rar
- Doozy UI Manager 2023
- 基于matlab实现夜间车牌识别程序(1).rar
- 基于matlab实现无线传感器网络无需测距定位算法matlab源代码 包括apit,dv-hop,amorphous在内的共7个
- 基于python的yolov5实现的旋转目标检测
- 基于matlab实现无线传感器网络 CAB定位仿真程序 这是无线传感器节点定位CAB算法的仿真程序,由matlab完成.rar
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- springcodespringcodespringcodespringcode
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功