美文网首页
4(AOP):Aspect(实例与讲解)(文末有项目连接)

4(AOP):Aspect(实例与讲解)(文末有项目连接)

作者: _River_ | 来源:发表于2021-04-30 21:25 被阅读0次
1:什么是Aspect切面
Aspect切面其实也就是一种切面,但它不针对url路径,它是可以直接针对执行的方法的。

过滤器  拦截器  Aspect切面 对比
三者功能类似,但各有优势,从过滤器--》拦截器--》切面,拦截规则越来越细致,执行顺序依次是过滤器、拦截器、Aspect切面。
一般情况下数据被过滤的时机越早对服务的性能影响越小;

权限校验,一般情况下,所有的请求都需要做登陆校验,此时就应该使用过滤器在最顶层做校验;

日志记录,一般日志只会针对部分逻辑做日志记录,而且牵扯到业务逻辑完成前后的日志记录,此时应该考虑拦截器,
然而拦截器也是依据URL做规则匹配,因此相对来说不够细致,
因此我们会考虑到使用Aspect切面实现,Aspect切面可以针对代码的方法级别做拦截,很适合日志功能。
2: 引入相关POM包
<dependency>  
    <groupId>org.aspectj</groupId>    
    <artifactId>aspectjweaver</artifactId>   
    <version>1.9.6</version>
</dependency>

3:Aspect设置切面
有两种方式使用Aspect来进行切面
1:环绕通知方式 只需要@Around注解即可

2:定义切点方式 :
    先用@Pointcut定义切点  设置对应的切点名称
    再使用  @Before 以及 @After 来设置该对应切点名称的的前后逻辑

两者最重要的核心点是设置 execution 的对应切面 所监视的方法
@Aspect
@Component
public class AspectAnnotationComponent {
    
    //环绕通知。
    //注意要有ProceedingJoinPoint参数传入。
    //execution配置规则    首先是:包名  然后是: 类名  然后是方法名:方法名   括号内是:参数
    //调用controller包下的任意类的任意方法时均会调用此方法 (注意:如果找不到 会提示显示红色)
    //@Around("execution(* com.controller.*.*(..))")
    @Around("execution(* com.example.demo.aspect.AspectTest.aspectMethodTestOne(..))")
    public void sayAround(ProceedingJoinPoint proceedingJoinPoint)
            throws Throwable{
        System.out.println("注解类型环绕通知@Around  ..环绕前");
        proceedingJoinPoint.proceed();//执行方法
        System.out.println("注解类型环绕通知@Around ..环绕后");
    }


    //定义切点
    @Pointcut("execution(* com.example.demo.aspect.AspectTest.aspectMethodTestTwo(..))")
    public void sayings(){
    }

    @Before("sayings()")
    public void sayHello(){
        System.out.println("注解类型 @Pointcut 前置通知");
    }
    //后置通知
    @After("sayings()")
    public void sayGoodbey(){
        System.out.println("注解类型 @Pointcut 后置通知");
    }
}
4:设置被Aspect 监视的代码
@Service
public class AspectTest {

    /**
     * 已经被Aspect切面方式  @Around 环绕
     */
    public void aspectMethodTestOne(){
        System.out.println("我是 aspectMethodTestOne  ");
    }

    /**
     * 已经被Aspect切面方式  @Pointcut定义为切点 并设置 before 与 after逻辑
     */
    public void aspectMethodTestTwo(){
        System.out.println("我是 aspectMethodTestTwo  ");
    }
}
5:测试结果

项目连接

请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/hesuijin-study-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/hesuijin-study-project.git

springboot-filter-interceptor项目模块下   aspect包

相关文章

网友评论

      本文标题:4(AOP):Aspect(实例与讲解)(文末有项目连接)

      本文链接:https://www.haomeiwen.com/subject/igjorltx.html