spring学习 十一 AspectJ-based的通知入门 不带参数的通知

AspectJ-Based方式的AOP,通知类不需要实现任何接口,且前置通知,后置通知,环绕通知,异常通知都可以写在一个类中,下面先实现一个简单的,不带参数的通知。

第一步定义通知类,通知类中的通知(方法)名称可以任意取

package com.airplan.pojo;

import org.aspectj.lang.ProceedingJoinPoint;

public class AspectJAdvice {
    /*
     * 前置通知
     */
    public void before() {
        System.out.println("前置通知执行");
    }
    
    /*
     * 后置通知,after通知,无论切点是否发生异常都会执行
     */
    public Object after() {
        System.out.println("after 通知执行了");
        return null;
    }
    
    /*
     * 后置通知,after-returning,只有切点正常结束时才会执行
     */
    public Object afterReturn() {
        System.out.println("afterReturn 通知执行了");
        return null;
    }
    
    /**
     * 环绕通知需要有一个返回值,以及一个参数
     * @param p
     * @return
     * @throws Throwable
     */
    public Object arround(ProceedingJoinPoint p) throws Throwable{
        System.out.println("执行环绕");
        System.out.println("环绕-前置");
        Object result = p.proceed();
        System.out.println("环绕后置");
        return result;
    }
    
    /*
     * 异常通知
     */
    public void mythrow(){
        System.out.println("异常");
    }
}

第二步配置

<?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
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- 第一步:注册通知类 ,与切点类-->
    
    <bean id="advices" class="com.airplan.pojo.AspectJAdvice"></bean>
    <bean id="pointCutClass" class="com.airplan.pojo.PointCutClass"></bean>
    <!-- 第二步:配置切面 -->
    <aop:config>
        <!-- 配置切面,绑定通知类 -->
        <aop:aspect ref="advices">
            <!-- 配置切点 -->
            <aop:pointcut expression="execution(* com.airplan.pojo.PointCutClass.*(..))" id="pointCutFun"/>
            <!-- 配置通知与切点关联 -->
            <aop:after method="after" pointcut-ref="pointCutFun"/>
            <aop:before method="before" pointcut-ref="pointCutFun"/>
            <aop:after-returning method="afterReturn" pointcut-ref="pointCutFun"/>
            <aop:around method="arround" pointcut-ref="pointCutFun"/>
            <aop:after-throwing method="mythrow" pointcut-ref="pointCutFun"/>
        </aop:aspect>
    </aop:config>
    
</beans>

第三步:测试代码

package com.airplan.test;

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

import com.airplan.pojo.PointCutClass;

public class AopDemo {
    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        PointCutClass pc = ac.getBean("pointCutClass",PointCutClass.class);
        pc.pointCutFun();
    }
}
原文地址:https://www.cnblogs.com/cplinux/p/9741687.html