Spring的AOP
第1章 AOP 的概述
1-1 AOP 的概念
-
AOP (面向切面编程)
-
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象的编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
-
面向切面编程,是oop(面向对象编程)的补充和完善,oop是纵向的继承结构来代表公共行为的集合,当需要引入另外一个与业务无关的松散的行为的话就很无力,比如日志系统,所有的对象系统都需要日志,以往的做法会产生大量的重复代码,耦合度提高,重用性降低,显然是不合适的。
-
aop用横向的代理机制将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低 模块间的耦合度,并有利于未来的可操作性和可维护性
-
-
什么是AOP
- AOP是面向切面编程
- AOP采用横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、 安全检查、缓存)即代理机制
- Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
-
传统方法----纵向继承 spring aop横向抽取机制:AOP底层的实现就是代理机制
1-2 AOP的相关术语
- Joinpoint(连接点): 所谓连接点是指那些可以被拦截到的点。在Spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
- 增删改查这些方法都可以被增强,这些方法称为是连接点
- Pointcut(切入点): 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义;被拦截的这个一个或者多个方法称为切入点。
- 增删改查这些方法都可以被增强,根据业务可能不会对所有的方法都进行拦截增强,如果对save方法进行了增强(做权限校验),则save方法称为是切入点
- Advice(通知/增强): 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。个人理解:对方法进行拦截之后所做的增强方法就是通知,分为前置通知,后置通知,异常通知,最终通知,环绕通知。
- 对save方法拦截后要进行权限校验,则权限校验的方法称为是通知
- Target(目标对象) 代理的目标对象
- 被增强的对象就是目标对象
- Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。
- 将权限校验应用到UserDaoImpl的save方法的过程称为织入
- spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
- Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
- 被应用了增强后(被织入后),就产生了一个代理对象
- Aspect(切面):是切入点和通知(引介)的结合
第2章 AOP的底层实现
2-1 JDK的动态代理
- AOP的底层实现—使用JDk动态代理
- JDk的动态代理只能对实现接口的类进行代理,对于不使用接口的业务类,无法使用JDK动态代理
代理代码:使用Spring 是不需要写以下代码的,只需要通过配置就可以实现
- JDk的动态代理只能对实现接口的类进行代理,对于不使用接口的业务类,无法使用JDK动态代理
2-2 CGLIB的动态代理
- AOP的底层实现—使用CGLIB的动态代理
- 对于不使用接口的业务类,无法使用JDK动态代理
- CGlib采用非常底层字节码技术,可以为一个类创建子类,解决无接口代理问题
- 创建代理, 使用Spring 是不需要写以下代码的,只需要通过配置就可以实现
2-3 代理知识的总结
第3章 Spring的一般切面编程案例
3-1 Spring的AOP的通知类型的介绍
传统Spring AOP增强类型
- 1、AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Adive
- 2、Spring按照通知Adive在目标类方法的连接点位置,可以分为5类
- 1.前置通知:在目标方法执行前实施增强
- 2.后置通知:在目标方法执行后实施增强
- 3.环绕通知:在目标方法执行前后实施增强
- 4.异常通知:在方法抛出异常后实施增强
- 5.(Spring只支持方法通知)引介通知:在目标类中添加一些新的方法和属性
3-2 选择练习
3-3 Spring的AOP的切面类型的介绍
- Spring AOP切面类型
- Advisor:代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截
- PointcutAdvisor:代表具有切点的切面,可以指定拦截目标类哪些方法
- IntroductionAdvisor:代表引介切面,针对引介通知而使用切面(不要求掌握)
3-4 Spring的一般切面案例的准备工作
准备工作:
-
1、在pom.xml引入AOP的两个依赖包:
aopalliance
spring-aop -
2、配置目标类
3-5 Spring的一般切面案例的代码实现
3-6 Spring的一般切面案例的其他属性的设置
3-7 选择练习
3-8 Spring的带有切入点的切面的配置案例
-
1、使用普通Adive作为切面,将对目标类所有方法进行拦截,不够灵活,在实际开发中常采用 带有切点的切面
-
2、常用PointcutAdvisor实现类
- DefaultPointcutAdvisor最常见的切面类型,它可以通过任意Pointcut和Advice组合定义切面
重点 - JdkRegexpMethodPointcut 构造正则表达式切点
构造正则表达式切点如图:
- DefaultPointcutAdvisor最常见的切面类型,它可以通过任意Pointcut和Advice组合定义切面
第4章 Spring的传统AOP的动态代理
4-1 Spring的传统AOP的自动代理的方式的介绍
-
前面的案例中,每个代理都是通过ProxyFacaoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大
-
解决办法:自动创建代理
- BeanNameAutoProxyCreator 根据Bean名称创建代理
- DefaultAdvisorAutoProxyCreator 根据Advisor本身包含信息创建代理
- AnnotationAwareAspectJAutoProxyCreator 基于Bean中的AspectJ注解进行自动代理
4-2 Spring的传统AOP的基于Bean名称的自动代理