学习Spring之Aop手稿

举报
且听风吟 发表于 2019/10/27 16:19:32 2019/10/27
【摘要】 AOP特点:面向切面编程, 利用AOP对业务逻辑的各个部分进行抽取公共代码, 降低耦合度, 提高代码重用性, 同时提高开发效率.采取横向抽取, 取代传统纵向继承体系重复性代码解决事务管理, 性能监视, 安全检查, 缓存, 日志等问题Spring AOP在运行期, 通过反向代理的方式解决类加载, 属性注入AspectJ是基于Java的AOP框架, 在Spring使用AspectJ实现AOPAO...

AOP特点:

  • 面向切面编程, 利用AOP对业务逻辑的各个部分进行抽取公共代码, 降低耦合度, 提高代码重用性, 同时提高开发效率.

  • 采取横向抽取, 取代传统纵向继承体系重复性代码

  • 解决事务管理, 性能监视, 安全检查, 缓存, 日志等问题

  • Spring AOP在运行期, 通过反向代理的方式解决类加载, 属性注入

  • AspectJ是基于Java的AOP框架, 在Spring使用AspectJ实现AOP

AOP实现机制:

 底层采用代理机制实现AOP.

2种代理机制:

 2.0、采用JDK的的动态代理Proxy;    
 2.1、采用CGLIB字节码增强

AOP专业术语:
 Target: 目标类 ( 需要被代理的类 )
 Joinpoint: 连接点 ( 可能需要使用的目标类方法 )
 Advice: 增强代码 ( 对连接点增强的代码 )
 PointCut: 切入点 ( 可能需要 Advice 增强的连接点 )
 Weaving: 织入 ( 创建代理对象 proxy 执行切入点的方法 )
 Aspect: 切面 ( Advice 与 PointCust的结合 )

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

SpringAOP术语

JDK/CGLIB的AOP实现

下面通过JDK动态代理和CGLIB字节码增强两种方式实现AOP操作:


当目标类没有实现接口或者需要更好的性能的时候就需要考虑使用CGLIB实现动态Proxy


JDK动态代理:
 1.目标类: Service层
 2.切面类: 使用JDK动态代理对Service层代码增强
 3.工厂类: 获得proxy对象


目标类:

image.png

切面, 增强连接点:

image.png

静态代理对象工厂:

image.png

applicationContext.xml:

image.png

测试方法:

image.png

CGLIB字节码增强动态代理:

原理: cglib动态生成一个代理类的子类, 子类重写代理类的所有不是final的方法, 在子类中采用方法拦截技术拦截所有父类的方法调用, 顺势织入切面逻辑, 实现AOP, 它比JDK动态代理要快。但其操作流程与JDK动态代理一致。

下面只给出静态代理工厂的代码:

image.png

cglib的整个流程与JDK的动态代理都是一样的, 就在底层处理接口和加载字节码文件有区别。

AOP联盟通知类型

AOP联盟定义Advice规范, 编写Advice代码需实现Advice接口。


Spring按照Advice在目标类中方法的连接点的位置, 分为5类:

image.png

AOP联盟的代理实现

  • 使用Spring提供的ProxyFactoryBean模拟代理过程, 实现Spring的AOP:

使用环绕型通知进行演示(目标类与前面的一样):

image.png

演示代码: 

切面类:

image.png

配置applicationContext.xml:

image.png

测试方法:

image.png

运行结果:

image.png

applicationContext.xml中创建代理类标签详解:

image.png

上面这种代理实现, 是在applicationContext.xml配置文件中模拟代理工厂产生代理对象, 在测试函数中获得是容器产生的代理对象proxyService.


  • 利用AspectJ简化Spring中ProxyFactoryBean的配置:

使用环绕型通知进行演示, 编写流程:

image.png

下面使用代码演示, 因为只需修改配置文件与测试类, 只给出配置文件代码:

image.png

相比于Spring提供的ProxyFactoryBean, AspectJ更加便捷。

AspectJ详解

AspectJ是基于Java的AOP框架, 用于自定义AOP开发.

  • 切入点表达式
    用于描述目标类中的目标方法, 指定哪些方法可作为切入点.

下面说明切入点表达式写法:

image.png

下面给出一个例子:

image.png

  • AspectJ通知类型
    与AOP联盟一样, AspectJ也定义了多种通知类型.

AspectJ总共6中通知类型:

image.png

环绕通知与其他通知之间的联系:

image.png

从上面看出, 完全可以使用环绕通知模拟前置通知, 后置通知, 环绕通知结合AfterThrowing, After实现AOP.

aop标签对应的通知类型种类:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

使用AOP联盟进行切面类编写, 需要定义通知类型, 切面类必须实现特定接口(MethodInterceptor), 然后为目标方法添加增强代码, 相比于AOP联盟, AspectJ只要定义切面类, 增强代码的使用完全交给配置文件, 避免代码污染, 简化操作。

使用AspectJ实现SpringAOP

基于xml配置通知类型的开发流程:
 1.导入AOP联盟, AspectJ, AOP依赖, Aspect规范 jar包.
 2.编写目标类: 接口与实现类.
 3.编写切面类: 编写AspectJ的通知类型方法, 方法名任意, 无需实现什么接口.
 4.配置xml: 配置通知类型.
 5.测试.


下面给出演示代码, 代码中已经给出注释加以说明(若有不懂请在评论区留言):

目标类 ( 接口与实现类 ):

image.png

切面类:

image.png

applicationContext.xml:

image.png

测试方法:

image.png

基于注解的通知类型开发流程:

1.在刚开始配置注解的时候, 可以按照 xml 中bean, aop的配置信息来给类/属性添加注解, 这样不容易把逻辑搞混.
2.测试, 其实整个开发过程与 xml 配置没什么区别, 都是一样的, 只是形式上有区别。

在给各种类添加注解之间, 一定要牢记:

  1. 在 xml 配置文件中添加扫描, 扫描注解类:

image.png

2.确定AOP注解生效:

image.png

AspectJ中通知类型的注解种类:

image.png

接下来给出演示代码:

目标类:

image.png

xml 配置文件 applicationContext.xml:

image.png

切面类:

image.png

本文转载自公众号【java学习之道】。

原文链接:https://mp.weixin.qq.com/s?__biz=MzU4NzYwNDAwMg==&mid=2247485351&idx=1&sn=3374330bbd8c27ef3063dfa85dbc6968&chksm=fde8ceeaca9f47fc0496f1571a4b84f474cb017dbac7e79558fdf6d6414119d719da02f122aa&scene=0#rd


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。