1.导入依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.9.1</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
2.随后我们创建一个启动类
package itcast;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringEventApp {
public static void main(String[] args) {
SpringApplication.run(SpringEventApp.class,args);
}
}
3.随后我们创建一个用于保存信息的pojo类
package itcast.dto;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class UserDto {
private String id;
private String age;
private String name;
}
4.构建controller层用于接受请求
package itcast.controller;
import itcast.dto.UserDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
@Slf4j
public class userController {
@Autowired
ApplicationContext applicationContext;
@GetMapping("/getUser/{id}")
public String aroundController(@PathVariable() String id) {
UserDto userDto = new UserDto();
userDto.setName("around");
userDto.setAge("18");
userDto.setId(id);
System.out.println("执行controller方法结果:"+userDto);
return userDto.toString();
}
@GetMapping("/getUser2/{id}")
public String beforeController(@PathVariable() String id) {
UserDto userDto = new UserDto();
userDto.setName("before");
userDto.setAge("18");
userDto.setId(id);
System.out.println("执行controller方法结果:"+userDto);
return userDto.toString();
}
@GetMapping("/getUser3/{id}")
public String afterController(@PathVariable() String id) {
UserDto userDto = new UserDto();
userDto.setName("after");
userDto.setAge("18");
userDto.setId(id);
System.out.println("执行controller方法结果:"+userDto);
return userDto.toString();
}
}
5.构建切面类(重点)
package itcast.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class UserAop {
@Pointcut("execution(* itcast.controller.userController.aroundController(..))")
public void idPointCut(){}
@Pointcut("execution(* itcast.controller.userController.beforeController(..))")
public void beforePointCut(){}
@Pointcut("execution(* itcast.controller.userController.afterController(..))")
public void afterPointCut(){}
@Around(value = "idPointCut()")
public void deleteRecord(ProceedingJoinPoint join) throws Throwable {
log.info("--------进入环绕增强--------");
Object[] args = join.getArgs();
String vm = (String) args[0];
System.out.println("在环绕切面中取得方法的入参 = " + vm);
Object proceed = join.proceed(args);
log.info("--------结束环绕增强--------");
}
@Before(value = "beforePointCut()")
public void before() throws Throwable {
log.info("--------进入前置增强方法--------");
}
@After(value = "afterPointCut()")
public void after() throws Throwable {
log.info("--------进入后置增强方法--------");
}
}