AOP(Aspect Oriented Programming):是面向切面编程的技术。AOP基于IOC基础,是对OOP的有益补充。
AOP术语名词
Joinpoint:连接点是指所有可能织入通知的方法理论上大部分方法都是连接点
Pointcut:切入点,已经被增强的方法
Advice:通知,增强的方法
Aspect:切面,通知所在的类就叫切面。
Weaving:织入,将通知应用到目标对象来创建新的代理对象的过程。
通知类型及执行顺序
通知的类型: 1.<aop:before > (前置通知) 2.<aop:after-returning > 返回通知 3.<aop:after-throwing > 异常通知 4<aop:after >后置通知5.<aop:around > 环绕通知
通知的执行顺序:
try{
调用前置通知
环绕前置处理
调用目标对象方法
环绕后置处理
调用后置通知
}catch(Exception e){
调用异常通知
}finally{
调用最终通知
}
注意:1.如果目标方法出现异常,将不会执行后置通知 (后置通知是在运行目标方法执行成功后调用的,如果目标方法执行失败(出现异常,后置通知将被调用 )2.最终通知无论是否发生异常都会执行
切入点表达式的写法
关键字:execution(表达式)
表达式格式:
访问修饰符 返回值 包名.包名.包名…类名.方法名(参数列表)
标准的表达式写法:
public void com.msg.service.impl.AccountServiceImpl.saveAccount()
访问修饰符可以省略
void com.msg.service.impl.AccountServiceImpl.saveAccount()
返回值可以使用通配符,表示任意返回值
* com.msg.service.impl.AccountServiceImpl.saveAccount()
包名可以使用通配符,表示任意包。但是有几级包,就需要写几个*.
* ....AccountServiceImpl.saveAccount())
包名可以使用…表示当前包及其子包
* …AccountServiceImpl.saveAccount()
类名和方法名都可以使用来实现通配
* ….()
参数列表:
可以直接写数据类型:
基本类型直接写名称 int
引用类型写包名.类名的方式 java.lang.String
可以使用通配符表示任意类型,但是必须有参数
可以使用…表示有无参数均可,有参数可以是任意类型(推荐使用)
全通配写法:
* ….(…)
实际开发中切入点表达式的通常写法:
切到业务层实现类下的所有方法
* com.msg.service.impl..(…)
Spring中基于XML的AOP配置步骤
-
把切面交给spring来管理
-
使用<aop:config >标签表明开始AOP的配置(以下内容都写在<aop:config >–</aop:config>)
-
使用< aop:pointcut > 指定:切入点
id属性:是给切面提供一个唯一标识
expression属性:用于指定切入点可使用切入点表达式。 -
在<aop:aspect >引入切面
ref属性:引入切面 -
编写通知类型
例如<aop:before >:表示配置前置通知