美文网首页
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