随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

简介:

切面操作使用的是动态代理,什么是代理?比如你去饭店吃饭,你只管点餐吃饭,而做菜上菜的操作都是饭店员工代理完成的。(只管主要功能而不管公共功能)

那什么是切面操作?以日志记录为例,你吃饭时,每当你吃了十口饭我就给你记录一次,这并不影响你吃饭(主要功能),又完成了日志记录功能,我就相当于那个代理对象,而你就是被代理,代理的操作是每吃十口饭记录+1。我的任何操作都不会对你产生影响。

那么如果不是代理呢?每当你吃了十口饭,你就需要停下自己记录一次,这样你的主要功能就受到了影响。

这样我还可以进行别的操作,比如记录吃饭之前状态、记录吃饭时的异常、记录吃完饭后的情况..... 从而形成日志。

 

在maven中加入依赖:

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

创建指定的切面类并标注:

@Aspect:声明为切面

@Component:注册为Bean交给spring管理,进入Ioc容器才能切入Ioc容器中的Bean

切面类:

package cn.tulingxueyuan.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Arrays;

@Aspect
@Component
public class LogUtil {


    // 前置通知
    @Before("execution(* cn.tulingxueyuan.service..*.*(..))")
    public static void before(){
        System.out.println("方法前");
    }

    // 后置通知
    @After("execution(* cn.tulingxueyuan.service..*.*(..))")
    public static void after(){
        System.out.println("方法后");
    }

    // 后置异常通知
    @AfterThrowing("execution(* cn.tulingxueyuan.service..*.*(..))")
    public static void afterException(){
        System.out.println("方法异常");
    }

    // 后置返回通知
    @AfterReturning("execution(* cn.tulingxueyuan.service..*.*(..))")
    public static void afterEnd(){
        System.out.println("方法返回");

    }
}

 xml配置:

     <!--扫描包:扫描类中所有注解,不扫描注解不是生效-->
    <context:component-scan base-package="cn.tulingxueyuan" >
    </context:component-scan>

    <!--因为我们使用的是注解方式的AOP,所以要开启注解AOP功能-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 

 

posted on 2022-05-31 23:49  时间完全不够用啊  阅读(91)  评论(0编辑  收藏  举报