spring 基于xml方式配置aop

什么是aop

  1. 什么是aop
作用 在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势 减少重复代码 提高开发效率 并且便于开发

2.aop关键概念

模拟aop

  1. 目标接口
package com.lovely.proxy.aop;

public interface TargetInterface {
    public abstract void save();
}

  1. 切点类
package com.lovely.proxy.aop;

/**
 * @author echo lovely
 * @date 2020/7/28 16:07
 */
public class Target implements TargetInterface {
    public void save() {
        try {
            System.out.println(1 / 0);
        } catch (Exception e) {
            System.out.println(e);
        }
        System.out.println("save running about aop...");
    }
}

  1. 切面类
package com.lovely.proxy.aop;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 切面类 里面写增强方法 advice 通知方法
 * @author echo lovely
 * @date 2020/7/28 16:05
 */
public class MyAspect {

    public void before() {
        System.out.println("前置增强...");
    }

    public void afterReturning() {
        System.out.println("后置增强...");
    }

    public Object around(ProceedingJoinPoint process) {
        System.out.println("环绕通知前...");
        Object obj = null;
        try {
            obj = process.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("环绕通知后...");
        return obj;
    }

    public void afterThrowing() {
        System.out.println("异常拉...");
    }

    public void after() {
        System.out.println("最终通知...");
    }

}

配置

   <!-- 目标对象 -->
   <bean id="target" class="com.lovely.proxy.aop.Target"></bean>
   <!-- 切面对象 -->
   <bean id="myAspect" class="com.lovely.proxy.aop.MyAspect"></bean>

<!-- aop配置 -->
    <!--  配置织入 被增强的方法(切点) 要进行那些增强(前置,后置)  -->
   <aop:config>
       <!-- 声明切面-->
       <aop:aspect ref="myAspect">
           <!-- 切点表达式的抽取 -->
           <aop:pointcut id="myPointcut" expression="execution(* com.lovely.proxy.aop.*.*(..))"/>

           <!-- 切面:通知 + 切点 -->
           <!--<aop:before method="before" pointcut="execution(public void com.lovely.proxy.aop.Target.save())"/>-->

           <!-- 前后置通知 -->
           <!--<aop:before method="before" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/>
           <aop:after-returning method="afterReturning" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/>-->

           <!-- 环绕增强 -->
           <!--<aop:around method="around" pointcut="execution(* com.lovely.proxy.aop.*.*(..))"/>-->

           <!-- 抛出异常通知 -->
           <!--<aop:after-throwing method="afterThrowing" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/>-->

           <!-- 最终通知 -->
           <!--<aop:after method="after" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/>-->

           <!-- 引用切点表达式 -->
           <aop:around method="around" pointcut-ref="myPointcut"/>
       </aop:aspect>
   </aop:config>

猜你喜欢

转载自blog.csdn.net/qq_44783283/article/details/107709440