版权声明:本文为博主原创文章,经博主允许,可自由共享,尽量不要用于商业用途。 https://blog.csdn.net/matrixbbs/article/details/89173411
1 创建项目
2 编写pom.xml文件,添加依赖
<dependency>
<groupId>org.aspectj</groupId>
<!-- runtime包 -->
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<!-- 织入包 -->
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<!-- 用于动态代理,基于类的代理 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1</version>
</dependency>
这里的aop包不需要再添加,因为web包里已经包含
3 编写核心演示业务,比如SayHello
package com.fhzheng.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value="/aop7")
public class SayHello {
@RequestMapping(value="/hello")
public String sayHello(@RequestParam("name") String name) {
return "Hello-------------"+name;
}
}
4 编写切面,即增强业务部分,比如在控制台打印输出信息
这里,最关键的几个部分是
1 切面要用@Aspect和@Component注解,让容器知道它是切面
2 定义切点表达式,特别要注意表达式的覆盖面【或者叫覆盖范围】,特别是
- 任意返回值类型
- 任意子包
- 任意类
- 任意方法
- 任意参数类型
3 通知的位置,即连接点的定义
- 前置通知
- 后置通知
- 环绕通知
- 返回后通知
- 异常后通知
4 整个过程叫织入,整个过程要理解
- 切面本身:在哪里做什么事情
- 切点:在哪个范围使用这个切面【哪些包的哪些类的哪些方法】==【切点表达式】
- 连接点:在哪个位置插入逻辑【之前之后包围异常等】
package com.fhzheng.demo.aspect;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class WebLog {
@Pointcut("execution(* com.fhzheng.demo.controller.*.*(..))")
public void cut(){}
@Before("cut()")
public void doBefore() {
System.out.println("前置通知");
}
// @Around("cut()")
// public void doAround() {
// System.out.println("环绕通知");
// }
//
@After("cut()")
public void doAfter() {
System.out.println("后置通知");
}
@AfterReturning("cut()")
public void doAfterReturning() {
System.out.println("返回后通知");
}
//
// @AfterThrowing("cut()")
// public void doAfterThrowing() {
// System.out.println("异常通知");
// }
}
5 运行并测试
核心业务结果
切面运行结果