Spring的AOP
1. 概念:
* Aspect Oriented Programming的缩写.
* 意为: 面向切面变成,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.
2. 作用:
* 在程序运行期间,不修改源代码对已有方法进行增强.
3. 优势:
1. 减少重复代码
2. 提高开发效率
3. 维护方法
4. AOP的实现方式:
* 使用动态代理技术
spring中的AOP术语
1. Joinpoint(连接点):
* 所谓连接点是指那些被拦截到的点.在Spring中,这些点指的是方法,因为spring只支持方法类型的连接点
2. Pointcut(切入点):
* 所谓切入点是指我们要对那些Joinpoint进行拦截的定义
3. Advice(通知/增强):
* 所谓通知是指拦截到Joinpoint之后所要做的事前就是通知.
* 通知的类型: 前置通知,后置通知,异常通知,最终通知,环绕通知
4. Introduction(引介):
* 引介是一种特殊的通知在不修改类的代码的前提下,Introduction可以在运行期间为类动态的添加一些方法和field
5. Target(目标对象):
* 代理的目标对象.
6. Weaving(织入):
* 是指把增强应用到目标对象来创建新的代理对象的过程
* spring采用动态代理织入,而AspectJ采用编译织入和类装载期织入
7. Proxy(代理):
* 一个类被AOP织入增强后, 就产生一个结果代理类
8. Aspect(切面):
* 是切入点和通知(引介)的结合.
spring中基于xml的AOP配置步骤
1. 把通知的bean也交给spring来管理
2. 使用aop:config标签表名开始AOP的配置
3. 使用aop:aspect标签表名开始配置切面
* id属性: 是给切面提供唯一标识
* ref属性: 是指定通知类bean的id
4. 在aop:aspect标签的内部使用对应标签来配置通知的类型
* 我们现在的示例是让printLog方法在切入点方法执行之前,所以是前置通知
* aop:before: 表示配置前置通知
* method属性: 用于指定logger哪个方法是前置通知
* pointcut属性: 用于指定切入点表达式,该表达式的含义指的是对业务层中那些方法增强
* 切入点表达式的写法:
1. 关键字: execution(表达式)
2. 表达式:
* 访问修饰符 返回值 包名.包名.包名...类名.方法名(参数列表)
3. 标准表达式写法:
public void com.itheima.service.impl.AccountServiceImpl.saveAccount()
4. 访问修饰符可以省略
void com.itheima.service.impl.AccountServiceImpl.saveAccount()
5. 返回值可以使用通配符表示任意返回值
* com.itheima.service.impl.AccountServiceImpl.saveAccount()
6. 包名可以使用通配符,表示任意包.但是有几级包,就写几个*
* *.*.*.*.AccountServiceImpl.saveAccount()
7. 包名可以使用..表示当前包及其子包
* *..AccountServiceImpl.saveAccount()
8. 类名和方法名都可以使用*来实现通配
* *..*.*()
9. 参数列表:
* 可以直接写数据类型
1. 基本数据类型直接写名称 int
2. 引用数据类型写包名.类名的方式 java.lang.String
* 可以使用通配符表示任意类型,但必须有参数
* 可以使用..表示有无参数均可,有参数可以是任意类型
10. 全通配写法;
* *..*.*(..)
- 实际开发中切入表达式的通常写法:
例子: 切到业务层实现类的所有方法
* com.itheima.service.impl.*.*(..)