zoukankan      html  css  js  c++  java
  • spring aop切面理解

     aop的概念以及与oop的区别以及为什么要用,什么时候要用,百度上各种copy的文章一大堆,就不再抄了,记录一下自己的理解

    ——切面用于切入方法,获取方法的一些参数,并做自定义操作。

    ——类似oop,是一种编程思想,如拦截器,旨在特定(有共性)的方法后,做统一的事情,如统一日志记录等。

    springboot整合第三方框架aspectj进行切面注解

    pom.xml引入jar  spring-aop 和 aspectj

    <!--spring aop -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>

    切面 TestAspect.java

    package com.flysand.demo.aspect;
    
    import com.alibaba.fastjson.JSON;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    /**
     * @author flysand on 2019/07/16
     **/
    @Aspect
    @Component
    public class TestAspect {
        @Pointcut("execution(* com.flysand.demo.controller.AopTestController.*(..))")
        public void pointCut(){}
    
    
        @Before("pointCut()")
        public void beforeMethod(JoinPoint joinPoint){
            // 执行方法前执行 2
            System.out.println("before pointcut");
            Object[] objects = joinPoint.getArgs();
            if (objects.length > 0) {
                for (Object object : objects) {
                    System.out.println(object);
                }
            }
    
        }
    
        @Around("pointCut()")
        public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            // 进入方法后最先执行 1
            System.out.println("before around method ");
            // 执行方法
            Object o = proceedingJoinPoint.proceed();
            // 执行方法后执行 3
            System.out.println("方法执行结果:" + JSON.toJSONString(o));
            System.out.println("after around method");
            return o;
        }
    
    
        @After("pointCut()")
        public void afterMethod(JoinPoint joinPoint) {
            // 方法执行完后执行  -- 不管是否抛异常,只要方法结束就执行  -- 必然执行 4
            System.out.println("after method");
    
        }
    
        @AfterReturning("pointCut()")
        public void afterReturning(){
            // 当方法有正常返回时执行  5
            System.out.println("after returning");
        }
    
        @AfterThrowing("pointCut()")
        public void afterThrowing(){
            // 当方法抛异常时执行  5
            System.out.println("after throwing");
        }
    }

    所有通知都可以创建相应的切入点pointcut,也可以创建一个公共的切入点,由其他通知分别调用

    各种通知的执行顺序:其中 around、before、after为永远执行的通知方法,afterReturning为正常返回时执行,afterThrowing为异常返回时执行

  • 相关阅读:
    Unity错误提示大全(遇到问题就更新)
    使用log4Net输出调试信息
    3.创建Manager类,演示对TestUser进行增删改查功能
    2.创建NHibernateHelper帮助类,生成sessionFactory
    1.使用FluentNHibemate 操作数据库,添加映射到数据库
    MySql介绍与安装
    搭建unity客户端
    搭建服务器端
    Photon介绍与安装
    简练软考知识点整理-实施定量风险分析
  • 原文地址:https://www.cnblogs.com/flysand/p/11193720.html
Copyright © 2011-2022 走看看