简介:
切面操作使用的是动态代理,什么是代理?比如你去饭店吃饭,你只管点餐吃饭,而做菜上菜的操作都是饭店员工代理完成的。(只管主要功能而不管公共功能)
那什么是切面操作?以日志记录为例,你吃饭时,每当你吃了十口饭我就给你记录一次,这并不影响你吃饭(主要功能),又完成了日志记录功能,我就相当于那个代理对象,而你就是被代理,代理的操作是每吃十口饭记录+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>
创建指定的切面类并标注:
1 2 3 | @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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)