1. AOP的相关概念
1.1 AOP概述
1.1.1 什么是AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
1.1.2 AOP的作用及优势
作用:
在程序运行期间,不修改源码对已有方法进行增强。
优势:
减少重复代码 提高开发效率 维护方便
1.1.3 AOP的实现方式
使用动态代理技术
1.2 AOP的具体应用
1.2.1 案例中问题
这是我们之前在struts2课程中做的一个完整的增删改查例子。下面是客户的业务层接口和实现类。
通过下面的代码,我们能看出什么问题吗?
1 | /** |
1 | /** |
上面代码的问题就是:我们的事务控制是重复性的代码。这还只是一个业务类,如果有多个业务了,每个业务类中都会有这些重复性的代码。
1.2.2 动态代理回顾
1.2.2.1 动态代理的特点
1 | 字节码随用随创建,随用随加载。 |
1.2.2.2 动态代理常用的有两种方式
1 | 基于接口的动态代理 |
1.2.2.3 使用JDK官方的Proxy类创建代理对象
此处我们使用的是一个演员的例子:
在很久以前,演员和剧组都是直接见面联系的。没有中间人环节。
而随着时间的推移,产生了一个新兴职业:经纪人(中间人),这个时候剧组再想找演员就需要通过经纪人来找了。下面我们就用代码演示出来。
1 | /** |
1 | /** |
1 | /** |
1.2.2.4 使用CGLib的Enhancer类创建代理对象
还是那个演员的例子,只不过不让他实现接口。
1 | /** |
1 | /** |
1.2.3 解决案例中的问题
思路只有一个:使用动态代理技术创建客户业务层的代理对象,在执行CustomerServiceImpl时,对里面的方法进行增强,加入事务的支持。
1 | /** |
1.3 Spring中的AOP
1.3.1 关于代理的选择
在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。
1.3.2 AOP相关术语
1 | Joinpoint(连接点): |
1.3.3 学习spring中的AOP要明确的事
1 | a、开发阶段(我们做的) |
2. 基于XML的AOP配置
2.1 环境搭建
2.1.1 准备客户的业务层和接口(需要增强的类)
1 | /** |
1 | /** |
2.1.2 拷贝必备的jar包
2.1.3 创建spring的配置文件并导入约束
1 |
|
2.1.4 把客户的业务层配置到spring容器中
1 | <!-- 把资源交给spring来管理 --> |
2.1.5 制作通知(增强的类)
1 | /** |
2.2 配置步骤
2.2.1 把通知类用bean标签配置起来
1 | <!-- 把通知类也交给spring来管理 --> |
2.2.2 使用aop:config声明aop配置
1 | <!-- aop的配置 --> |
2.2.3 使用aop:aspect配置切面
1 | <!-- 配置切面 :此标签要出现在aop:config内部 |
2.2.4 使用aop:before配置前置通知
1 | <!-- 用于配置前置通知:指定增强的方法在切入点方法之前执行 |
2.2.5 使用aop:pointcut配置切入点表达式
1 | <aop:pointcut expression="execution(public void com.wgy.service.impl.CustomerServiceImpl.saveCustomer())" id="pt1"/> |
2.3 切入点表达式说明
1 | execution: |
2.4 完整配置
1 |
|
2.5 通知的类型
2.5.1 类型说明
1 | <!-- 配置通知的类型 |
2.5.2 环绕通知的特殊说明
1 | /** |
3. 基于注解的AOP配置
3.1 环境搭建
3.1.1 准备客户的业务层和接口(需要增强的类)
1 | /** |
1 | /** |
3.1.2 拷贝必备的jar包
3.1.3 创建spring的配置文件并导入约束
1 |
|
3.1.4 把资源使用注解让spring来管理
1 | /** |
3.1.5 在配置文件中指定spring要扫描的包
1 | <!-- 告知spring,在创建容器时要扫描的包 --> |
3.2 配置步骤
3.2.1 把通知类也使用注解配置
1 | /** |
3.2.2 在通知类上使用@Aspect注解声明为切面
1 | /** |
3.2.3 在增强的方法上使用注解配置通知
1 | /** |
3.2.4 在spring配置文件中开启spring对注解AOP的支持
1 | <!-- 开启spring对注解AOP的支持 --> |
3.3 不使用XML的配置方式
1 |
|
-------------本文结束感谢您的阅读-------------
本文标题: Spring(三)
本文链接: https://wgy1993.gitee.io/archives/680971a4.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
