Spring BOOT AOP基础应用教程

目录
  • 面试课题 Spring boot AOP
  • Spring boot 动态代理
  • AOP 切面
    • 基本知识
    • 自定义注解
    • 自定义注解
    • 如何在AOP引用

面试课题 Spring boot AOP

Spring boot 中 AOP是其中 重要的特性,其实现的方式借助的拦截器 + Proxy 动态代理,在AOP主要用于日志打印,安全拦截,事务处理,异常处理和性能统计,要向深刻了解Spring boot AOP 原理,从 Spring 动态代理的原理讲起

Spring boot 动态代理

原理:

动态代理底层实现借助 java.lang.reflect.Proxy 的 newProxyInstance的方法

其有是三个参数:

1.Class的类加载器

2.接口方法

3.h 增强方式

在代码中 定于 interface , interfaceImpl 具体的实现类 ,使用 java 代理代码方式进行处理:

 Proxy.newProxyInstance(Main.Class.getClassLoader(), new Class[] {UserDao.class}, new InvocationHandler() {
})
//在 InvocationHandler()  调用方法之前增强添加预处理 和 方法调用后的处理东西
public interface UserDao {
    public int add(int a, int b);
}
public class UserDaoImpl implements UserDao {
    @Override
    public int add(int a, int b) {
        System.out.println("add 方法执行了");
        return a+b;
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Class[] interfaces = {UserDao.class};
        UserDaoImpl userDaoImpl = new UserDaoImpl();
        //创建接口实现类代理对象
        //此处用UserDao作为返回值的类型,是因为我们传入的interfaces就是UserDao.class
        UserDao dao = (UserDao) Proxy.newProxyInstance(Main.class.getClassLoader(), interfaces, new InvocationHandler() {
            //把想要代理的对象传递进来
            private Object object = userDaoImpl;
            //增强的逻辑
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //方法之前
                System.out.println("方法之前执行 : " + method.getName() + "; 传递的参数:" + Arrays.toString(args) + "; object:" + object);
                //被增强的方法执行,填写要增强的对象、参数
                Object res = method.invoke(object, args);
                //方法之后
                System.out.println("方法之后执行 : " + method.getName() + "; 传递的参数:" + Arrays.toString(args) + "; object:" + object);

                return res;
            }
        });
        int res = dao.add(1, 2);
        System.out.println("这个是res: " + res);
    }
}

总结

Spring boot中 能够实现AOP的底层原理,之上的代码属于静态编码方式 ,需要相同的逻辑抽象出来,因此诞生了AOP,在Spring boot中 动态代理有两种

基于接口的JDK-动态代理(返回类型属于接口类型);

基于父类的cglib 代理,通过继承关系代理(不管是接口还是实现类 OK)

在实际使用过程中 Spring boot 默认 cglib动态代理 ,使用范围更加广泛

AOP 切面

基本知识

  • pointcut: 切入点: execution… 表示需要在哪些方法上生效,对哪些方法进行增强 – 使用正则表达式
  • Advice: 通知: 自定义处理 ,通知 分为BeforAdvice, AfterAdvice, ThrowAdvice
  • Advisor: 将 PointCut 与 Advice 进行连接起来定义哪些通知在哪些方法增强生效 – 对切面XXAOP 使用@Ascpect 注解进行生效定义
@Component
@Aspect
public class BookAop {
    // 定义切入点
    public static final String POINT_CUT = "execution(* com.example.bootaop.dao..*.*(..))";
    @Before(POINT_CUT)
    public void before() {
        System.out.println("----------添加图书方法前[校验]-----------");
    }
    @After(POINT_CUT)
    public void after(JoinPoint jp) {
        System.out.println("----------添加图书成功后-----------");
        System.out.println(jp.getTarget().getClass());
        System.out.println(Arrays.asList(jp.getArgs()));
    }
}

自定义注解

如上显示是 AOP的切面,但是AOP切面有个使用不好定法在于 pointcut 写正则表达式 无法准确的表达,最好有个插拔式方式 ,引入到自定义注解,自定义注解弥补这一缺陷

元注解

元注解是 java 自带的类型

@Retention 注解 保留策略(SOURCE,CLASS,RUNTIME)

@Retention(RetentionPolicy.SOURCE) 仅存在于源码中

@Retention(RetentionPolicy.CLASS) 存在于class字节码中,但运行时无法获取

@Retention(RetentionPolicy.RUNTIME) 存在于class字节码中,运行时可以通过反射获取

Target 注解 作用范围

@Target(ElementType.TYPE) 接口、类等

@Target(ElementType.FIELD) 字段

@Target(ElementType.METHOD) 方法

@Target(ElementType.PARAMETER) 方法参数

@Target(ElementType.CONSTRUCTOR) 构造函数

@Target(ElementType.LOCAL_VARIABLE) 局部变量

@Target(ElementType.ANNOTATION_TYPE) 注解

@Target(ElementType.PACKAGE) 包

自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyLog {
    String value() default "";
}

如何在AOP引用

在 pointcut = “@annotation(MyLog)”

@Slf4j
@Aspect
@Component
public class LogAspect {
    @Around("@annotation(myLog)")
    public Object around(ProceedingJoinPoint point, MyLog myLog) throws Throwable{
        String className = point.getTarget().getClass().getName();
        String methodName = point.getSignature().getName();
        String value = myLog.value();
        log.info("类名:{},方法名:{},注解值:{}",className,methodName,value);
        log.info("方法之前执行");
        long startTime = System.currentTimeMillis();
        Object proceed = point.proceed();
        long endTime = System.currentTimeMillis();
        long time = endTime - startTime;
        log.info("方法之后执行");
        log.info("方法耗时:{}", time);
        return proceed;
    }
}

到此这篇关于Spring BOOT AOP基础应用教程的文章就介绍到这了,更多相关Spring BOOT AOP内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot通过AOP与注解实现入参校验详情

    目录 前言: 注解标记 通过AOP对方法进行增强 测试Get请求 测试POST请求 解决方法代码 再次测试POST请求 前言: 问题源头: 在日常的开发中,在Service层经常会用到对某一些必填参数进行是否存在的校验.比如我在写一个项目管理系统: 这种必填参数少一些还好,如果多一些的话光是if语句就要写一堆.像我这种有代码洁癖的人看着这一堆无用代码更是难受. 如何解决: 在Spring里面有一个非常好用的东西可以对方法进行增强,那就是AOP.AOP可以对方法进行增强,比如:我要校验参数是否存在

  • SpringBoot使用AOP统一日志管理的方法详解

    目录 前言 实现 1.引入依赖 2.定义logback配置 3.编写切面类 4.测试 前言 请问今天您便秘了吗?程序员坐久了真的会便秘哦,如果偶然点进了这篇小干货,就麻烦您喝杯水然后去趟厕所一边用左手托起对准嘘嘘,一边用右手滑动手机看完本篇吧. 实现 本篇AOP统一日志管理写法来源于国外知名开源框架JHipster的AOP日志管理方式 1.引入依赖 <!-- spring aop --> <dependency> <groupId>org.springframework

  • Springboot+AOP实现时间参数格式转换

    目录 前言 场景 效果 实战 自定义注解一 自定义注解二 拦截器 工具类 使用 接口 调用 前言 场景 前端传过来的时间参数,我们后端自定义时间格式转化使用,想转成什么就转成什么. 不同业务场景,跟前端对接,一种控件基本时间参数是固定格式的,为了避免前端去转换时间参数的格式,跟前端约定好,让他们固定传递一种格式,后端自己看需求转换格式使用即可. 效果 ① 从 yyyy-MM-dd HH:mm:ss 转换成 yyyy-MM-dd 使用: ② 从 yyyyMMddHHmmss 转换成 yyyy-MM

  • SpringBoot中利用AOP和拦截器实现自定义注解

    目录 前言 Spring实现自定义注解 1.引入相关依赖 2.相关类 Java实现自定义注解 通过Cglib实现 通过JDk动态代理实现 Cglib和JDK动态代理的区别 写在最后 前言 最近遇到了这样一个工作场景,需要写一批dubbo接口,再将dubbo接口注册到网关中,但是当dubbo接口异常的时候会给前端返回非常不友好的异常.所以就想要对异常进行统一捕获处理,但是对于这种service接口使用@ExceptionHandler注解进行异常捕获也是捕获不到的,应为他不是Controller的

  • SpringBoot使用AOP实现统计全局接口访问次数详解

    目录 AOP是什么 AOP的作用和优势 常见的动态代理技术 AOP相关概念 实现 AOP是什么 AOP(Aspect Oriented Programming),也就是面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的传统已维护的一种技术. AOP的作用和优势 作用:在程序运行期间,在不修改源代码的情况下对某些方法进行功能增强 优势:减少重复代码,提高开发效率,并且便于维护 常见的动态代理技术 jdk代理:基于接口的动态代理技术 cglib代理:基于父类的动态代理技术 AOP相关概念

  • springboot利用AOP完成日志统计的详细步骤

    目录 1.创建日志表 2.创建实体类 3.创建枚举类 4.创建自定义注解 5.获取ip的util 6.线程池util 7.HttpServletRequest实现类 8.添加过滤器 9.添加AOP核心类 10.接口测试 步骤写的很详细,可以直接复制拿来用的,其中用到了过滤器.自定义注解以及AOP切面,来完成日志记录统计,感兴趣的收藏起来,以后遇到了可以直接用. 可能步骤会比较多,但是整体跟着思路下来,应该没什么大问题的. 项目用到了过滤器,可能有的人会不理解,之所以用过滤器是因为想要在日志记录p

  • SpringBoot中通过AOP整合日志文件的实现

    目录 1.导入相关的依赖 2.log4j2 日志文件 3.dao层的接口以及实现类 4.Service层业务实现类 5.Controller层接口控制类 6.编写业务类增强类,加入一个日志文件记录 7.运行测试,查看结果 1.导入相关的依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter&

  • springboot使用AOP+反射实现Excel数据的读取

    如果我们遇到把excel表格中的数据导入到数据库,首先我们要做的是:将excel中的数据先读取出来.因此,今天就给大家分享一个读取Excel表格数据的代码示例: 为了演示方便,首先我们创建一个Spring Boot项目:具体创建过程这里不再详细介绍: 示例代码主要使用了Apache下的poi的jar包及API:因此,我们需要在pom.xml文件中导入以下依赖:         <dependency>             <groupId>org.apache.poi</

  • springboot利用aop实现接口异步(进度条)的全过程

    目录 一.前言 二.时序图 三.功能演示 四.关键代码 Controller AsyncAop AsyncService 五.源码地址 总结 一.前言 在项目中发现有接口(excel导入数据)处理数据需要耗时比较长的时间,是因为数据量比较大,同时数据的校验需要耗费一定时间,决定使用一种通用的方法解决这个问题. 解决方案:通过aop使接口异步处理,前端轮询另外一个接口查询进度. 目标: 1接口上一个注解即可实现接口异步(优化:可以通过header参数动态控制是否异步) 2一个方法实现进度条的更新

  • Spring BOOT AOP基础应用教程

    目录 面试课题 Spring boot AOP Spring boot 动态代理 AOP 切面 基本知识 自定义注解 自定义注解 如何在AOP引用 面试课题 Spring boot AOP Spring boot 中 AOP是其中 重要的特性,其实现的方式借助的拦截器 + Proxy 动态代理,在AOP主要用于日志打印,安全拦截,事务处理,异常处理和性能统计,要向深刻了解Spring boot AOP 原理,从 Spring 动态代理的原理讲起 Spring boot 动态代理 原理: 动态代理

  • spring boot aop 记录方法执行时间代码示例

    本文研究的主要是spring boot aop 记录方法执行时间的实现代码,具体如下. 为了性能调优,需要先统计出来每个方法的执行时间,直接在方法前后log输出太麻烦,可以用AOP来加入时间统计 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency&

  • Spring Boot配置元数据方法教程

    这篇文章主要介绍了Spring Boot配置元数据方法教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean上是非常有用的.但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot Configuration Processor和 关联的 JSON 元数据文件,该 JSON 文档记录每个属性的含义.约束等. 配置元数据 作为开发人员

  • 使用Spring Boot AOP处理方法的入参和返回值

    前言 IOC和AOP是Spring 中最重要的两个模块.这里练习一下如何使用Spring Boot AOP处理方法的入参和返回值. Spring AOP的简单介绍: AOP(Aspect-Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任(例如事务处理.⽇志管理.权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于提高系统的可拓展性和可维护性.

  • macOS下Spring Boot开发环境搭建教程

    macOS搭建Spring Boot开发环境,具体内容如下 软硬件环境 macOS Sierra java 1.8.0_65 maven 3.5.0 idea 2017.1.5 前言 最近接触了一点java web相关的知识,了解一下最近比较火的开发框架Spring Boot,站在一个从未涉足过java web和spring的开发者角度来讲,spring boot确实是一个非常不错的框架,配置简单,容易入门,对于想入行java web的童鞋,是一个很好的切入点. maven安装 这里选择mave

  • spring boot集成shiro详细教程(小结)

    我们开发时候有时候要把传统spring shiro转成spring boot项目,或者直接集成,name我们要搞清楚一个知识,就是 xml配置和spring bean代码配置的关系,这一点很重要,因为spring boot是没有xml配置文件的(也不绝对,spring boot也是可以引用xml配置的) 引入依赖: <dependency> <artifactId>ehcache-core</artifactId> <groupId>net.sf.ehcac

  • 详解Spring Boot的GenericApplicationContext使用教程

    教程展示了如何在Spring应用程序中使用GenericApplicationContext .在该示例中,我们创建了一个Spring Boot控制台应用程序. Spring是一个流行的Java应用程序框架,Spring Boot 是Spring的演变,可以帮助您轻松创建独立的,基于生产级别的Spring应用程序. GenericApplicationContext是一个实现ApplicationContext,它不预设指定任何bean定义格式; 例如XML或注释. 在下面的应用程序中,我们Ge

  • Spring boot AOP通过XML配置文件声明

    通过 XML 配置文件声明 在前两篇博文和示例中,我们已经展示了如何通过注解配置去声明切面,下面我们看看如何在 XML 文件中声明切面.下面先列出 XML 中声明 AOP 的常用元素: AOP配置元素 用途 aop:advisor 定义AOP通知器 aop:after 定义AOP后置通知(不管被通知的方法是否执行成功) aop:after-returning 定义AOP返回通知 aop:after-throwing 定义AOP异常通知 aop:around 定义AOP环绕通知 aop:aspec

  • Spring Boot maven框架搭建教程图解

    摘要:让Spring应用从配置到运行更加快速,演示DIY Spring Boot框架时,如何配置端口号,如何添加日志. Spring Boot 框架帮助开发者更容易地创建基于Spring的应用程序和服务,使得开发者能够快速地获得所需要的Spring功能.提供了非功能性的大型项目类特性,如(如内嵌服务器.安全.度量.健康检查.外部化配置),内部封装了tomcat的一些核心jar包,将发布封装了,因此不需要将项目(war包)发布到外部tomcat上. 可以在Spring Boot官网 https:/

随机推荐