Spring框架系列之AOP思想

本文内容纲要:

- 1、AOP概述

- 2、Spring底层AOP实现原理

- 3、Spring 基于 AspectJ AOP 开发的相关术语

微信公众号:compassblog

欢迎关注、转发,互相学习,共同进步!

有任何问题,请后台留言联系!

1、AOP概述

(1)、什么是 AOP

AOP 为 Aspect Oriented Programming 的缩写,意为“面向切面编程”。AOP 是 OOP (面向对象)的延续,可以对业务的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性和开发效率。

(2)、AOP 思想图解:横向重复,纵向切取

  • 过滤器

Image

  • 拦截器

Image

  • 事务管理

Image

(3)、AOP 可以实现的功能

  • 权限验证
  • 日志记录
  • 性能控制
  • 事务控制

(4)、AOP 底层实现的两种代理机制

  • JDK的动态代理 :针对实现了接口的类产生代理

  • Cglib的动态代理 :针对没有实现接口的类产生代理,应用的是底层的字节码增强的技术生成当前类的子类对象

2、Spring底层AOP实现原理

(1)、 JDK 动态代理增强一个类中方法:被代理对象必须要实现接口,才能产生代理对象。如果没有接口将不能使用动态代理技术。

public class MyJDKProxy implements InvocationHandler { private UserDao userDao; public MyJDKProxy(UserDao userDao) { this.userDao = userDao; } public UserDao createProxy(){ UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this); return userDaoProxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("save".equals(method.getName())){ System.out.println("权限校验============= } return method.invoke(userDao, args); } }

(2)、Cglib 动态代理增强一个类中的方法:可以对任何类生成代理,代理的原理是对目标对象进行继承代理。如果目标对象被final修饰,那么该类无法被cglib代理。

public class MyCglibProxy implements MethodInterceptor{ private CustomerDao customerDao; public MyCglibProxy(CustomerDao customerDao){ this.customerDao = customerDao; } // 生成代理的方法: public CustomerDao createProxy(){ // 创建Cglib的核心类: Enhancer enhancer = new Enhancer(); // 设置父类: enhancer.setSuperclass(CustomerDao.class); // 设置回调: enhancer.setCallback(this); // 生成代理: CustomerDao customerDaoProxy = (CustomerDao) enhancer.create(); return customerDaoProxy; } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if("delete".equals(method.getName())){ Object obj = methodProxy.invokeSuper(proxy, args); System.out.println("日志记录================"); return obj; } return methodProxy.invokeSuper(proxy, args); } }

3、Spring 基于 AspectJ AOP 开发的相关术语

  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点
  • Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
  • Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
  • Introduction(引介):引介是一种特殊的通知,在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field
  • Target(目标对象):代理的目标对象
  • Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入
  • Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类
  • Aspect(切面):是切入点和通知(引介)的结合

您可能还喜欢:

  • Spring框架系列(二)之Bean的注解管理
  • 【SSH框架】之Spring系列(一)
  • 【SSH框架】之Hibernate系列(一)
  • 讲讲本人本专业找工作的那些事儿
  • 前端系列之JavaScript基础知识概述

本系列后期仍会持续更新,欢迎关注!

如果你认为这篇文章有用,欢迎转发分享给你的好友!

本号文章可以任意转载,转载请注明出处!

扫码关注微信公众号,了解更多

Image

本文内容总结:1、AOP概述,2、Spring底层AOP实现原理,3、Spring 基于 AspectJ AOP 开发的相关术语,

原文链接:https://www.cnblogs.com/compassblog/p/8486478.html

以上是 Spring框架系列之AOP思想 的全部内容, 来源链接: utcz.com/z/296692.html

回到顶部