序言:
大家都知道Spring是由Loc和Aop两大组件构成,loc是依赖注入,控制着各种对象的管理,Aop是切面,什么是切面呢,就是当我们想在所有方法执行之前或之后等执行某段业务逻辑的时候,我们就可以采用切面的方式来完成,Aop主要分为切面、连接点、切点、通知这几部分,重点在于这个切点,定义了哪些规则类可以被捕获,我们常用包名.*,来指定对应路径类,但这样还不是非常的灵活,假如想要在指定的方法,或者没有规范的包路径时,就可以采用自定义注解的方式,将切入点指定到我们的自定义注解,哪些方法想要实现切面功能只需添加注解就可以完成这一操作,非常方便,接下来就为大家讲解如何使用自定义注解实现切面
首先第一步、导入pom
<!--aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.7.3</version>
</dependency>
第二步、自定义注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*自定义注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
此处指定在方法上,并且是运行时
第三步、实现切面类
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
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 MyAnnotationAspect {
/**
*切点(自定义注解类全路径)
*/
@Pointcut("@annotation(com.config.MyAnnotation)")
public void asAnnotation() {}
/**
*方法之前
*/
@Before("asAnnotation()")
public void before(JoinPoint joinPoint) {
System.out.println("方法执行前:" + joinPoint.getSignature().getName());
}
/**
*方法之后
*/
@After("asAnnotation()")
public void after(JoinPoint joinPoint) {
System.out.println("方法执行后:" + joinPoint.getSignature().getName());
}
/**
*等等
*/
}
方法共有 前置通知 @Before(“asAnnotation()”)、后置通知 @After(“asAnnotation()”)、返回时通知 @AfterReturning(pointcut = “asAnnotation()”,returning = “object”)、抛出异常时通知 @AfterThrowing(“asAnnotation()”)、环绕通知 @Around(“asAnnotation()”)、此处只列举两种
第四步、方法使用
@MyAnnotation()
public void test(){
// 业务
}
当然你也可以在自定义注解类中定义一些属性,供方法使用注解时传入参数,后续我们再补充
#好了,本次教程到这里就结束了,希望大家多多点赞关注支持(首席摸鱼师 微信同号),持续跟踪最新文章吧~