小村村长

导航

切入点表达式回顾

切入点表达式:

完整写法:execution(方法的修饰符 方法的返回值 类的全类名.方法名(参数))
    支持通配符的写法:
    *   : 标识任意字符串
    ..  : 任意重复次数
    1. 方法的修饰符可以省略:
    2. 返回值可以使用*号代替:标识任意返回值类型
    3. 包名可以使用*号代替,代表任意包(一层包使用一个*)
    4. 使用..配置包名,标识此包以及此包下的所有子包
    5. 类名可以使用*号代替,标识任意类
    6. 方法名可以使用*号代替,表示任意方法
    7. 可以使用..配置参数,任意参数

切入点表达式代码
导入第三方jar包
	<!-- 切入点表达式 -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.8</version>
    </dependency>
切入点表达式:
    作用: 找到需要增强的方法
    格式: 修饰符 返回值 包名.类名.方法名称(参数列表)
        public void com.village.service.impl.AccountServiceImpl.save())
    规则:
        *   : 标识任意字符串
        ..  : 任意重复次数
            public void com.village.service.impl.AccountServiceImpl.save(..)
        1. 方法的修饰符可以省略:
            void com.village.service.impl.AccountServiceImpl.save(..)
        2. 返回值可以使用*号代替:标识任意返回值类型
            * com.village.service.impl.AccountServiceImpl.save(..)
        3. 包名可以使用*号代替,代表任意包(一层包使用一个*)
            * com.village.*.*.AccountServiceImpl.save(..)
        4. 使用..配置包名,标识此包以及此包下的所有子包
            * com..AccountServiceImpl.save(..)  不建议
        5. 类名可以使用*号代替,标识任意类
            * com.village.*.*.*.save(..)
        6. 方法名可以使用*号代替,表示任意方法
            * com.village.*.*.*.*(..)
            * *.*.*.*.*(..)   不要
        7. 可以使用..配置参数,任意参数

        最终建议格式:
            * com.village.service.*.AccountServiceImpl.*(..)

 切面类代码

/**
 * 此类为通知类:
 *      在该类中定义了,各种通知需要调用的相关方法
 */
@Component("myAspect")
@Aspect // 声明此类为切面类(通知类)
public class MyAspect {
    /**
     * 定义一个无参无返回值的方法
     * 在方法上添加@Pointcut注解,用于定义切入点表达式
     * 引用时,只需要使用当前方法的名称()   pt()
     */
    @Pointcut("execution(* com.village.service.impl.*.*(..))")
    public void pt(){}
    /**
     * 前置通知调用的方法
     */
    //@Before("pt()")
    public void before(){
        System.out.println("前置通知...111111111111");
    }

    /**
     * 后置通知调用的方法
     */
    //@AfterReturning("pt()")
    public void afterReturning(){
        System.out.println("后置通知...2222222222222");
    }

    /**
     * 异常通知调用的方法
     */
    //@AfterThrowing("pt()")
    public void afterThrowing(){
        System.out.println("异常通知...33333333333333");
    }

    /**
     * 最终通知调用的方法
     */
    //@After("pt()")
    public void after(){
        System.out.println("最终通知...44444444444444");
    }

    /**
     * 环绕通知调用的方法
     */
    @Around("pt()")
    public Object around(ProceedingJoinPoint joinPoint){
        Object result = null;
        try {
            System.out.println("前置通知...");
            // 相当于 方法字节码对象.invoke();
            // 让原方法执行
            result = joinPoint.proceed();
            System.out.println("后置通知...");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常通知...");
        }finally {
            System.out.println("最终通知...44444444444444");
        }
        return result;
    }
}

 

posted on 2022-02-09 00:20  小村村长  阅读(32)  评论(0编辑  收藏  举报