学习Spring之Aop手稿
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的结合 )
SpringAOP术语
JDK/CGLIB的AOP实现
下面通过JDK动态代理和CGLIB字节码增强两种方式实现AOP操作:
当目标类没有实现接口或者需要更好的性能的时候就需要考虑使用CGLIB实现动态Proxy
JDK动态代理:
1.目标类: Service层
2.切面类: 使用JDK动态代理对Service层代码增强
3.工厂类: 获得proxy对象
目标类:
切面, 增强连接点:
静态代理对象工厂:
applicationContext.xml:
测试方法:
CGLIB字节码增强动态代理:
原理: cglib动态生成一个代理类的子类, 子类重写代理类的所有不是final的方法, 在子类中采用方法拦截技术拦截所有父类的方法调用, 顺势织入切面逻辑, 实现AOP, 它比JDK动态代理要快。但其操作流程与JDK动态代理一致。
下面只给出静态代理工厂的代码:
cglib的整个流程与JDK的动态代理都是一样的, 就在底层处理接口和加载字节码文件有区别。
AOP联盟通知类型
AOP联盟定义Advice规范, 编写Advice代码需实现Advice接口。
Spring按照Advice在目标类中方法的连接点的位置, 分为5类:
AOP联盟的代理实现
使用Spring提供的ProxyFactoryBean模拟代理过程, 实现Spring的AOP:
使用环绕型通知进行演示(目标类与前面的一样):
演示代码:
切面类:
配置applicationContext.xml:
测试方法:
运行结果:
applicationContext.xml中创建代理类标签详解:
上面这种代理实现, 是在applicationContext.xml配置文件中模拟代理工厂产生代理对象, 在测试函数中获得是容器产生的代理对象proxyService.
利用AspectJ简化Spring中ProxyFactoryBean的配置:
使用环绕型通知进行演示, 编写流程:
下面使用代码演示, 因为只需修改配置文件与测试类, 只给出配置文件代码:
相比于Spring提供的ProxyFactoryBean, AspectJ更加便捷。
AspectJ详解
AspectJ是基于Java的AOP框架, 用于自定义AOP开发.
切入点表达式
用于描述目标类中的目标方法, 指定哪些方法可作为切入点.
下面说明切入点表达式写法:
下面给出一个例子:
AspectJ通知类型
与AOP联盟一样, AspectJ也定义了多种通知类型.
AspectJ总共6中通知类型:
环绕通知与其他通知之间的联系:
从上面看出, 完全可以使用环绕通知模拟前置通知, 后置通知, 环绕通知结合AfterThrowing, After实现AOP.
aop标签对应的通知类型种类:
使用AOP联盟进行切面类编写, 需要定义通知类型, 切面类必须实现特定接口(MethodInterceptor), 然后为目标方法添加增强代码, 相比于AOP联盟, AspectJ只要定义切面类, 增强代码的使用完全交给配置文件, 避免代码污染, 简化操作。
使用AspectJ实现SpringAOP
基于xml配置通知类型的开发流程:
1.导入AOP联盟, AspectJ, AOP依赖, Aspect规范 jar包.
2.编写目标类: 接口与实现类.
3.编写切面类: 编写AspectJ的通知类型方法, 方法名任意, 无需实现什么接口.
4.配置xml: 配置通知类型.
5.测试.
下面给出演示代码, 代码中已经给出注释加以说明(若有不懂请在评论区留言):
目标类 ( 接口与实现类 ):
切面类:
applicationContext.xml:
测试方法:
基于注解的通知类型开发流程:
1.在刚开始配置注解的时候, 可以按照 xml 中bean, aop的配置信息来给类/属性添加注解, 这样不容易把逻辑搞混.
2.测试, 其实整个开发过程与 xml 配置没什么区别, 都是一样的, 只是形式上有区别。
在给各种类添加注解之间, 一定要牢记:
在 xml 配置文件中添加扫描, 扫描注解类:
2.确定AOP注解生效:
AspectJ中通知类型的注解种类:
接下来给出演示代码:
目标类:
xml 配置文件 applicationContext.xml:
切面类:
本文转载自公众号【java学习之道】。
- 点赞
- 收藏
- 关注作者
评论(0)