Spring面向切面编程

一、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)
posted @ 2022-03-10 00:00  FinnYY  阅读(116)  评论(0编辑  收藏  举报