Spring框架之AOP面向切面编程

1>动态代理

  • 动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具(不是真是定义的类)在程序运行是很由JVM根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确定
  • 动态代理的作用
    • 1、在目标类源代码不改变的情况下,增加功能
    • 2、减少代码的重复
    • 3、专注业务逻辑代码
    • 4、解耦合,让你的业务功能和日志,事务非事务功能分离

1.1、JDK动态代理

  • 动态代理的实现方式常用的有两种:使用JDK的Proxy,与通过CGLIB生成代理。JDK的动态要求目标对象必须实现接口,这是java设计上的要求
  • 从jdk1.3以来,java语言通过java.lang.reflect包提供桑格类支持代理模式Proxy,Method和InovcationHandler。

1.2、CGLIB动态代理(了解)

  • CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成库类,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP。
  • 使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。但对于无接口的类,要为其创建动态代理,就要使用CGLIB来实现。
  • CGLIB代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用CGLIB生成动态代理,要求目标类必须能够被继承,既不能是final的类,也不能包含final方法。
  • CGLIB经常被应用在框架中,例如Spring,Hebernate等。cglib的代理效率高于JDK。项目中直接使用动态代理的地方不多,一般都使用框架提供的功能

2>AOP面向切面编程

2.1、AOP基础

  • AOP(Aspect Orient Programming),面向切面编程。基于动态代理的,可以使用jdk、cglib两种代理方式
  • Aop:就是动态代理的规范化,把动态代理的实现步骤,方式都定义好了,让开发人员用一种统一的方式实现动态代理
  • AOP(面向切面编程)
    • Aspect:切面,给你的目标类增加的功能,就是切面,如给业务添加日志、事务都是切面
    • Orient:面向、对着
    • Programming:编程
    • oop:面向对象编程

2.2、面向切面编程

  • 1、需要在分析项目功能时,找出切面
  • 2、合理地安排切面的执行时间(在目标方法前,还是在目标方法后)
  • 3、合理的安全切面执行的位置,在哪个类,哪个方法增加增强功能

2.3、AOP术语

  • 1、Aspect:切面,表示增强的功能,就是一堆代码,完成某一个功能
    • 常见的切面功能有日志、事务、统计信息、参数检查、权限验证
  • 2、JoinPoint:连接点,连接业务方法和切面的位置,例如:某类中的业务方法
  • 3、PointCut:切入点,指多个连接点方法的集合。多个方法
  • 4、目标对象:给哪个类的方法增加功能,这个类就是目标对象
  • 5、Advice:通知,通知表示切面功能执行的时间

2.4、切面三要素

  • 1、切面的功能代码,切面干什么
  • 2、切面的执行位置,使用PointCut表示切面执行的位置
  • 3、切面的执行时间,使用Advice表示时间,在目标方法之前,还是目标方法之后

2.5、aop的实现

  • aop是一个规范,一个标准
  • aop的技术实现框架:
    • 1、spring:spring在内部实现了aop规范,能做aop的工作
      • spring主要在事务处理时使用aop
      • 我们项目开发是很少使用spring的aop实现
      • 因为spring的aop比较笨重
    • 2、aspectJ:一个开源的专门做aop的框架。
      • spring框架中继承了aspectj框架,通过spring就能使用aspectj的功能
      • aspectJ框架实现aop有两种方式:
        • 1)使用xml的配置文件
        • 2)使用注解,我们在项目要做aop功能,一般都使用注解,aspectj有5个注解

3>学习使用aspectj框架

3.1、切面的执行时间

  • 切面的执行时间,这个执行时间在规范中叫作Advice(通知、增强)
  • 在aspectj框架中使用注解表示的。也可以使用xml配置文件中的标签
    • 1)@Before
    • 2)@AfterReturning
    • 3)@Around
    • 4)@AfterThrowing
    • 5)@After

3.2、切面执行的位置

  • 表示切面执行的位置,使用的是切入点表达式。
  • execution("* …service..*(…)")

3.3、切入点表达式

  • AspectJ 定义了专门的表达式用于指定切入点。表达式的原型是:
execution(modifiers-pattern? ret-type
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值