AOP实现常见的5种通知(增强) 【前置通知 Before、后置通知 afterReturning、环绕通知 Around、异常通知 AfterThrowing、最终通知 after】
全注解写的,多看几遍就会了
导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.13</version>
</dependency>
config类
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration//配置类
@ComponentScan("text")//扫描bean
@EnableAspectJAutoProxy//扫描AOP文件
public class Configration {
}
aop类
import lombok.extern.java.Log;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Log//日志包,可以不要,用sout一样
@Aspect//AOP操作
@Component//bean
public class AopText {
@Before("execution(* text.entry.Student.say(*))")
public void before(JoinPoint joinPoint){
System.out.println(Arrays.toString(joinPoint.getArgs()));
log.info("这是say方法之前的日志");
}
@AfterReturning(value = "execution(* text.entry.Student.say(*))",returning = "obj")
public void after(Object obj){
System.out.println(obj);
log.info("这是say方法之后的日志");
}
// around方式,注意,around方法需要有返回值
@Around("execution(* text.entry.Student.say(*))")
public Object text(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("say方法执行之前的操作");
Object proceed = joinPoint.proceed();
System.out.println("say方法执行之后的操作");
return proceed;
}
}
main
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import text.config.Configration;
import text.entry.Student;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(Configration.class);
Student student = context.getBean(Student.class);
student.say("hello");
}
}
student实体类
import org.springframework.stereotype.Component;
@Component//bean
public class Student {
public String say(String say){
System.out.println("这是学生类的方法");
return say;
}
}