Spring ~AOP的实现


接口

package com.guo.aspectj.xml;

public interface UserDao {
    public void addUser();
}

实现类

package com.guo.aspectj.xml;

public class UserDaoImpl implements UserDao {
    public void addUser() {
        System.out.println("添加用户信息");
        //用于测试异常
        //int i = 10/0;
    }
}

切面类

  • 在切面类中编写通知
    1. 前置通知
      • 方法执行前
    1. 后置通知
      • returning属性:用于设置后置通知的第二个参数的名称,Object类型
        与切面类中 myAfterReturning 方法的参数保持一致
    1. 环绕通知
    1. 异常通知
    1. 最终通知
package com.guo.aspectj.xml;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 切面类
 * 在此类中编写增强处理
 */
public class MyAspect {

    //前置通知
    public void myBefore(JoinPoint joinPoint) {
        System.out.print("前置通知:");
        System.out.print("目标类是:" + joinPoint.getTarget());
        System.out.println(",被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());
    }

    //后置通知
    public void myAfterReturning(JoinPoint joinPoint){
        System.out.println("后置通知:");
        System.out.println("被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());
    }

    /**
     * 环绕通知
     * ProceedingJoinPoint 是JoinPoint 子接口,表示可以执行目标方法
     * 1. 必须是Object类型的返回值
     * 2. 必须接受一个参数,类型为:ProceedingJoinPoint
     * 3. 必须 throws Throwable
     */
    public Object myAround(ProceedingJoinPoint proceedingJoinPoint)throws  Throwable{
        //开始
        System.out.println("环绕开始,执行目标方法前");
        //执行当前目标方法
        Object obj = proceedingJoinPoint.proceed();
        //结束
        System.out.println("环绕结束,执行目标方法后");

        return obj;
    }

    //异常通知
    public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
        System.out.println("异常通知:"+"出错了"+e.getMessage());
    }

	//最终通知
    public void myAfter(){
        System.out.println("最终通知:方法结束后释放资源");
    }
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--1. 目标类-->
    <bean id="userDao" class="com.guo.aspectj.xml.UserDaoImpl"/>
    <!--2. 切面-->
    <bean id="myAspect" class="com.guo.aspectj.xml.MyAspect"/>
    <!--3. aop编程-->
    <aop:config>
        <!--配置切面-->
        <aop:aspect ref="myAspect">
            <!--3.1 配置切入点,通知增强方法有哪些 -->
            <aop:pointcut id="myPointCut" expression="execution(* com.guo.aspectj.xml.*.*(..))"/>
            <!--3.2 关联通知Advice和切入点pointcut-->

            <!--3.2.1 前置通知-->
            <aop:before method="myBefore" pointcut-ref="myPointCut"/>
            <!--
                3.2.2 后置通知
                在方法返回之后执行,获得返回值
                returning属性:用于设置后置通知的第二个参数的名称,Object类型
            -->
            <aop:after-returning method="myAfterReturning" pointcut-ref="myPointCut" returning="joinPoint"/>
            <!--3.2.3 环绕通知-->
            <aop:around method="myAround" pointcut-ref="myPointCut"/>
            <!--
                3.2.4 抛出通知:用于处理程序的异常
                    若没有异常则不执行
                    throwing属性:设置通知的第二个参数名称,Throwable类型
            -->
            <aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointCut" throwing="e"/>
            <!--3.2.5 最终通知 无论程序发生任何事情,都将执行-->
            <aop:after method="myAfter" pointcut-ref="myPointCut"/>
        </aop:aspect>
    </aop:config>

</beans>

测试

package com.guo.aspectj.xml;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @AUTHOR 清川
 * @create 2021-09-16   22:22
 */
public class TestXmlAspectj {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/guo/aspectj/xml/applicationContext.xml");
        UserDao userDao = applicationContext.getBean("userDao", UserDao.class);
        userDao.addUser();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值