一、AOP 的作用及其优势
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势:减少重复代码,提高开发效率,并且便于维护
二、AOP 的底层实现
实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态
的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
三、AOP 的动态代理技术
常用的动态代理技术
1.JDK 代理 : 基于接口的动态代理技术
2. cglib 代理:基于父类的动态代理技术
四、基于 XML 的 AOP 开发
1.导入坐标
<!-- 导入 spring 的 context 坐标, context 依赖 aop--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> <!-- aspectj 的织入 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency>
基础配置
<!--定义切面--> <bean id="mySpect" class="com.finnlee.aop.MySpect" ></bean> <!--定义切入点--> <bean id="logs" class="com.finnlee.service.Logs"></bean> <aop:config proxy-target-class="true"> <aop:aspect ref="mySpect"> <aop:pointcut id="myPointcut" expression="execution(* com.finnlee.service.*.*(..))"/> <aop:before method="before" pointcut-ref="myPointcut" ></aop:before> </aop:aspect> </aop:config>
五、XML 配置 AOP 详解
表达式语法: execution([修饰符] 返回值类型 包名.类名.方法名(参数))
访问修饰符可以省略
返回值类型、包名、类名、方法名可以使用星号* 代表任意
包名与类名之间一个点 . 代表当前包下的类,两个点 .. 表示当前包及其子包下的类
参数列表可以使用两个点 .. 表示任意个数,任意类型的参数列表
常用:execution(* com.finnlee.aop.*.*(..))
六、通知类型
前置通知 <aop:before> 用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知 <aop:after-returning> 用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知 <aop:around>
用于配置环绕通知。指定增强的方法在切入点方法之前和之后都
执行
异常抛出通知 <aop:throwing> 用于配置异常抛出通知。指定增强的方法在出现异常时执行
最终通知 <aop:after> 用于配置最终通知。无论增强方式执行是否有异常都会执行
配置文件中: @EnableAspectJAutoProxy(proxyTargetClass = true)