Spring AOP
0. 思想
运用动态代理的方式对核心业务类的方法进行增强,对核心逻辑和非核心逻辑进行隔离,把非核心逻辑织入到核心业务逻辑之中。开发人员在开发时可以专注于核心业务逻辑,使各个业务逻辑之间的耦合度降低,提高程序的可复用性。
1. AOP的术语和细节
Jointpoint(连接点)被拦截的方法,通常是业务层的所有方法。
Pointcut(切入点)并不是所有业务层的方法都需要被拦截增强。那些需要被增强的方法是切入点。
Advice(通知/增强)指拦截到的
Jointpoint之后需要做的事情。通知包括前置通知、后置通知、异常通知、最终通知、环绕通知。Taeget(目标对象)被代理的对象。
Weaving(织入)是指把增强应用到目标对象来创建代理对象的过程。
Proxy(代理)一个类被
AOP织入增强后,产生的一个结果代理类。Aspect(切面)是切入点和通知的结合。(需要手动配置)
2. XML配置AOP步骤
把通知
bean交给spring管理使用
app:config标签表明开始AOP配置使用
aop:aspect标签表明开始配置切面id:切面的唯一标识
ref:指定通知类bean的id在
aop:aspect标签内部使用对应标签来配置通知的类型,比如aop:before表示配置前置通知。method属性用于指定通知类中哪个方法是前置通知pointcut属性用于指定切入点表达式,表示对业务层哪些方法增强切入点表达式写法:
关键字:
execution(表达式)表达式:访问修饰符 返回值 全限定类名.方法名(参数列表)
标准写法:
public void com.billychen.service.impl.AccountServiceImpl.saveAccount()访问修饰符可以省略
void com.billychen.service.impl.AccountServiceImpl.saveAccount()返回值可以使用通配符,表示任意返回值
* com.billychen.service.impl.AccountServiceImpl.saveAccount()包名可以使用通配符表示任意包,但是有几个包就要写几个
*.比如* *.*.*.*.AccountServiceImpl.saveAccount()包名可以使用..表示当前包及其子包
* *..AccountServiceImpl.saveAccount()类名和方法名均可以使用
*实现通配参数列表写数据类型或全限定类名
可以使用通配符表示任意参数类型,但必须有参数。也可以使用
..表示有无参数均可以
全通配写法:* *..*.*(..)实际开发的通常写法是切到业务层实现类的所有方法
* com.billychen.service.impl.*.*(..)
以下是一个实例:
在该实例中,Logger是一个通知类,AccountServiceImpl是一个核心业务的类。
1 |
|
3.使用注解
配置类如下:
1 | package com.billychen.config; |
Logger类如下(即通知类)
1 | package com.billychen.utils; |