Spring_AOP容器
2021-06-18 11:03
标签:系统 roc throw proc color return 控制 增强 info 一、代理模式 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、创建通知方法 四、AOP XML配置实现 五、AOP拦截注释 如果目标角色实现了接口,AOP有代理,返回的是代理对象,需要通过接口接收。 Spring_AOP容器 标签:系统 roc throw proc color return 控制 增强 info 原文地址:https://www.cnblogs.com/dhome/p/9716234.htmlpackage 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;
}
}