Spring_AOP
一、代理模式
1、代理模式的设计原则:
·代理类与委托类具有相似的行为
·代理类增强委托类的行为
2、代理模式实现的三要素:
代理角色、目标角色、共同行为
实现行为接口,持有目标对象的引用
3、静态代理和动态代理
1)静态代理
特点:程序运行前制作代理角色
代理目标角色单一
代理类数量无法控制
2)动态代理
程序运行期动态创建代理角色
·JDK动态代理,回调方式实现
·cglib动态代理,继承方式实现
区别:
JDK动态代理:委托类必须要有接口,制作过程较快,执行慢
Cglib动态代理:委托类可以没有接口,继承的思维来实现相似性,制作代理过程比较慢,执行快
二、AOP(面相切面编程)
AOP的两种实现机制是JDK动态代理和cglib动态代理
AOP主要应用于日志记录,性能统计,安全控制,事务处理额等方面,实现公共行为的重复使用
降低模块之间的耦合度,提高业务代码的聚合度(高内聚低耦合)
提高代码的复用性
提高系统的扩展性
Aop基本概念
Joinpoint(连接点):spring中指被拦截到的每一个方法
Pointcut(切入点):规定拦截哪些方法,对那些方法进行处理
Advice(通知):拦截到每一个连接点后要做的操作
前置通知、返回通知、最终通知、异常通知、环绕通知
Aspect(切面):切入点与通知的结合
Target(目标对象):被代理的目标对象
Weave(织入)
Introduction(引入)
三、AOP注解实现
1、XML:引入命名空间,开启aop代理环境
2、Maven项目引入Aspect坐标
3、创建切面类 @Aspect定义切面类
4、声明方法为切入点 @Pointcut 匹配规则定义 execution
5、创建通知方法
package com.shsxt02.proxy; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Aspect @Component public class LogCut { @Pointcut("execution(* com.shsxt02.service..*.*(..))") public void cut() { } @After(value = "cut()") public void before(){ System.out.println("前置通知,目标方法执行前执行..."); } @AfterReturning(value = "cut()") public void afterReturn(){ System.out.println("返回通知,方法正常结束后执行..."); } @After(value = "cut()") public void after(){ System.out.println("最终通知,方法是否发生异常均会执行..."); } @AfterThrowing(value = "cut()",throwing = "e") public void afterThrow(Exception e){ System.out.println("异常通知,异常时执行..."+e); } // 环绕通知 @Around(value = "cut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { Object result=null; System.out.println("环绕前置..."); System.out.println("环绕通知..."); System.out.println("方法签名"+pjp.getSignature()); System.out.println("目标对象"+pjp.getTarget()); System.out.println("种类"+pjp.getKind()); Object[] objects=pjp.getArgs(); for(Object o:objects){ System.out.println("参数"+o); } result= pjp.proceed(); // 返回的目标对象 System.out.println("环绕后置..."); return result; } }
四、AOP XML配置实现
五、AOP拦截注释
如果目标角色实现了接口,AOP有代理,返回的是代理对象,需要通过接口接收。