Spring-aop
特点 是对oop的补充,解决代码混乱和代码分散的问题,通过动态代理实现AOP
概念 切面 实现AOP功能的类
通知 切面类中实现切面功能的方法
连接点 程序执行的特定位置
切点 连接点的定义
目标 被通知的对象
代理 向目标应用通知而产生的对象
用法 要通过接口创建目标的代理
配置AOP 注解 基于AspectJ
容器配置 启用扫描器
启用AspectJ注解支持 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
定义切面类 @Component 容器管理
@Aspect 切面类
定义通知 参数JoinPoint 代表连接点的数据
getSignature().getName() 方法名
getArgs() 返回Object[] 参数列表
通知类型 @Before 前置通知(在方法执行前执行)
@After 后置通知(在方法执行后执行,不论是否发生异常)
@AfterReturuning 返回通知(returning=返回值的参数名)(必须有对应参数)
@AfterThrowing 异常通知 throwing=“接收异常对象的参数”
@Around 环绕通知(可实现其他通知,可控制目标方法的调用)
要求必须有ProceedingJoinPoint类型的参数
必须明确调用ProceedingJoinPoint的proceed()方法
(通过代理调用目标方法,并接受返回值)
必须有返回值(返回执行目标方法的结果)
适当位置添加通知代码
前置 调用proceed()前
后置 在调用proceed()后的finally里
返回 在调用proceed()并接收返回值后
异常 在proceed()返回异常时
切点表达式 @通知类型注解(pointcut=“execution(修饰符 返回值类型 包名.类名.方法名(参数类型))”)
*可以代表任意修饰符、返回值类型、包名、类名、方法名
..可以代表任意个数的参数类型
切点表达式重用 在空的java类上添加@Pointcut(切点表达式)注解
在通知的注解里使用“方法名()”代替切点表达式
在其他切面类通知的注解里使用“类名.方法名()”代替切点表达式
XML 把切面类已bean的形式加入容器(注解方式优先级高于XML方式)
<aop:config> <aop:aspect ref="切面类bean的id"> 定义切面类
<aop:before method="方法名" pointcut="切点"></aop:before> 定义通知,前置
<aop:after method="方法名" pointcut-ref="公共切点id"></aop:after> 后置通知
<aop:after-returning method="方法名" returning="参数名" pointcut-ref="公共切点id"/> 返回通知
<aop:after-throwing method="方法名" throwing="参数名" pointcut-ref="公共切点id"/> 异常通知
<aop:around method="方法名" pointcut-ref="公共切点id"/> 环绕通知
<aop:pointcut id="" expression="切点"/> 定义公共切点