Spring 复习之AOP

什么是AOP?

Aop是有别与OOP模式的切面编程模式。OOP将软件系统分为了多个模块类似的,用户管理模块,订单管理等,而AOP是对OOP模式的一种补充,把各个模块中需要重复涉及到的功能点给抽取出来做成一个切面的形式来提供给各个模块使用,这种方式对业务代码的侵入性小,耦合度低,常用的有日志系统,异常处理,性能统计等。

在Spring中可以直接通过注解或XML配置的方式来实现AOP功能,在这顺便说一句,Spring中的AOP可以说是把AspectJ的切面特性给整合进来了,对开发者更加友好。

Spring中使用AOP(注解形式):

1.首先在配置文件中配置开启AOP

<aop:aspectj-autoproxy proxy-target-class="true"/>

proxy-target-class这个参数默认是false即使用JDK动态代理,true使用CGLIB代理,在使用JDK动态代理的时候需要注意,被代理的业务类需要实现接口才行不然会报错,因为jdk动态代理是基于接口的,而CGLIB代理是对class字节码文件进行的增强处理使代理类继承了业务类。

2.定义一个切面类如下:


@Aspect                         指定一个类为切面类       
@Pointcut("execution(* com.service.UserService.add(..))")  指定切入点表达式
@Before("pointCut_()")              前置通知: 目标方法之前执行
@After("pointCut_()")               后置通知:目标方法之后执行(始终执行)
@AfterReturning("pointCut_()")       返回后通知: 执行方法结束前执行(异常不执行)
@AfterThrowing("pointCut_()")           异常通知:  出现异常时候执行
@Around("pointCut_()")              环绕通知: 环绕目标方法执行

AOP的实现原理

通过代理模式实现的,代理模式是一种常见的设计模式,主要是为了通过代理来控制被访问的对象。

根据选择的不同又分为两种实现方式,JDK动态代理和CGLIB代理模式。主要讲下JDK动态代理,JDK动态代理实现的时候的业务类需要实现某个接口,然后定义一个InvocationHandler的实现类去实现InvocationHandler接口,通过JDK提供的API,Proxy的newProxyInstance方法来生成一个代理类,在调用代理类的方法的时候其实是通过InvocationHandler中的 invoke方法去调用的,所以我们可以在这个Invoc方法中去做一些事情,比如事务啊这些。

接口:

被代理的业务类:

自定义InvocationHandler的实现类:

测试类:

发布了16 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/BeNiceman/article/details/104945092