步骤一:创建springboot web 工程
然后 pom 文件中引入 Spring AOP 相关包:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
第二步: 创建切入目标代码,这里是创建 Controller
@RestController
public class HelloAopController {
@RequestMapping("/hello")
public String execute(String username,String passwd) {
System.out.println("execute1.........." + username + ":" + passwd);
return "Hello";
}
@RequestMapping("/hello2")
public String execute2(String username,String passwd) {
System.out.println("execute2.........." + username + ":" + passwd);
return "Hello";
}
}
步骤三:创建切面类
@Aspect
@Component
public class MyAspect{
@Pointcut("execution(* com.example.demo.controller.*.execute(..))")
public void execute() {}
@Before("execute()")
public void beforeExecute(JoinPoint joinPoint) {
String args = joinPoint.toString();
Object[] objects = joinPoint.getArgs();
for (Object object : objects) {
System.out.println("object--- " + object.toString());
}
System.out.println("切面 beforeExecute ........." + args);
}
@After("execute()")
public void afterExecute(JoinPoint joinPoint) {
System.out.println("切面 afterExecute .........");
}
}
注意点:
- 要添加 @Component,让该切面类再项目启动时加载为组件
- @Pointcut(“execution(* com.example.demo.controller..execute(…))")中的.execute是指com.example.demo.controller 包下的所有类 的 execute方法,只会对execute方法生效,当改为"execution(* com.example.demo.controller..(…))” 时,会对所有方法生效
步骤四: 在启动类上添加注解 @EnableAspectJAutoProxy
@EnableAspectJAutoProxy
@SpringBootApplication
public class SpringbootAop2Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootAop2Application.class, args);
}
}
可得到结果:
打开浏览器: http://localhost:8080/hello?username=LiMing&passwd=@LM.123@
object--- LiMing
object--- @LM.123@
切面 beforeExecute .........execution(String com.example.demo.controller.HelloAopController.execute(String,String))
execute1..........LiMing:@LM.123@
切面 afterExecute .........
=========================================
处理方法参数
改造 切面 类
@Aspect
@Component
public class MyAspect{
@Pointcut("execution(* com.example.demo.controller.*.*(com.example.demo.domain.Login)) && args(login)")
public void execute(Login login) {}
@Before("execute(login)")
public void beforeExecute(Login login) {
System.out.println("切 - 执行前 ........." + login.toString());
}
@After("execute(login)")
public void afterExecute(Login login) {
System.out.println("切 - 执行后 .........");
}
}
Login.java
public class Login {
private String userName = "LiMing";
private String passwd="@LM.123@";
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "Login [userName=" + userName + ", passwd=" + passwd + "]";
}
}
改造 controller 方法
@RestController
public class HelloAopController {
@RequestMapping("/hello")
public String execute(Login login) {
System.out.println("execute.........." + login.toString());
return "Hello";
}
}
可得到结果:
浏览器: http://localhost:8080/hello
切 - 执行前 .........Login [userName=LiMing, passwd=@LM.123@]
execute..........Login [userName=LiMing, passwd=@LM.123@]
切 - 执行后 .........