iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring BOOT AOP基础应用教程
  • 615
分享到

Spring BOOT AOP基础应用教程

2024-04-02 19:04:59 615人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

面试课题 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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring BOOT AOP基础应用教程

本文链接: https://www.lsjlt.com/news/153465.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring BOOT AOP基础应用教程
    目录面试课题 Spring boot AOPSpring boot 动态代理AOP 切面基本知识自定义注解自定义注解如何在AOP引用面试课题 Spring boot AOP Spri...
    99+
    2024-04-02
  • Java spring AOP基础
    目录一、AOP概述二、AOP相关语述三、AOP与动态代理3.1JDK动态代理3.2CGLib动态代理3.3两者对比总结一、AOP概述 AOP,即面向切面编程,简单来说就是将代码中重复...
    99+
    2024-04-02
  • Spring基础之AOP的概念介绍
    目录前言Spring的AOP的功能和目标代理方式@AspectJ的支持启用@AspectJ通过Java注解启用AspectJ注解支持:通过XML配置启用AspectJ注解定义一个切面...
    99+
    2024-04-02
  • Spring基础篇之初识DI和AOP
    前言  作为从事java开发的码农,Spring的重要性不言而喻,你可能每天都在和Spring框架打交道。Spring恰如其名的,给java应用程序的开发带了春天般的舒爽感觉。Spring,可以说是任何一个java开发者通往技术高阶的必备基...
    99+
    2023-05-30
  • pytorch collate_fn的基础与应用教程
    目录作用原则基础datasetdataloader应用情形总结作用 collate_fn:即用于collate的function,用于整理数据的函数。 说到整理数据,你当然要会用数据...
    99+
    2024-04-02
  • 零基础搭建boot+MybatisPlus的详细教程
    目录1.准备工作1.1 创建数据库表1.2 创建boot项目1.3 创建实体类(映射数据库表)2.使用mybatisPlus(操作数据库)2.1 添加mybatisPlus依赖2.2...
    99+
    2024-04-02
  • Spring Boot 2.x基础教程之使用@Scheduled实现定时任务的方法
    我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信、邮件之类的操作,也可能会定时地检查和监控一些标志、参数等。 创建定时任务 在Spring ...
    99+
    2024-04-02
  • spring boot拦截器如何使用spring AOP实现
    本篇文章为大家展示了spring boot拦截器如何使用spring AOP实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在spring boot中,简单几步,使用spring AOP实现一个拦...
    99+
    2023-05-31
    springboot spring aop 拦截器
  • 【Spring Boot整合MyBatis教程】
    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力...
    99+
    2023-08-18
    mybatis spring boot java
  • Spring Boot如何使用AOP记录日志
    小编给大家分享一下Spring Boot如何使用AOP记录日志,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在项目开发中经常,日...
    99+
    2024-04-02
  • Spring中的AOP编程怎么应用
    本文小编为大家详细介绍“Spring中的AOP编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring中的AOP编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。AOP 概述AOP 为 A...
    99+
    2023-07-05
  • Spring + Spring Boot + MyBatis + MongoDB的整合教程
    前言我之前是学Spring MVC的,后面听同学说Spring Boot挺好用,极力推荐我学这个鬼。一开始,在网上找Spring Boot的学习资料,他们博文写得不是说不好,而是不太详细。我就在想我要自己写一篇尽可能详细的文章出来,下面话不...
    99+
    2023-05-30
    springboot mybatis mongodb
  • Spring框架AOP基础之代理模式详解
    目录一、模拟场景二、代理模式静态代理动态代理一、模拟场景 创建接口 public interface Calculator { int add(int i, int j); ...
    99+
    2022-11-13
    Spring代理模式 Spring AOP代理模式
  • 基于Spring(Boot)下策略模式的使用方法教程
    这篇文章主要讲解了“基于Spring(Boot)下策略模式的使用方法教程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于Spring(Boot)下策略模式...
    99+
    2024-04-02
  • JavaScriptTypescript基础使用教程
    目录简介安装安装命令使用原因TypeScript类型概述JS原有的类型TS新增的类型类型别名泛型简介 typescript是微软公司开发的开源编程语言,Type+Javascript...
    99+
    2022-12-08
    JavaScript Typescript JS Typescript基本使用
  • Python基础教程
    6.4.5 参数收集的逆过程 假设有如下函数: def add(x,y): return x+y 比如说有个包含由两个相加的数字组成的元组: params = (1,2) 使用*运算符对参数进行“分配”,不过是在调用而不是在定义时使用: ...
    99+
    2023-01-31
    基础教程 Python
  • Spring Cloud Eureka基础应用及原理
    目录Eureka简介搭建Eureka服务注册中心搭建Eureka服务提供者搭建Eureka服务调用者Eureka服务注册和发现Eureka简介 Eureka这个词来源于古希腊语,意为...
    99+
    2024-04-02
  • Spring Boot 底层原理基础深度解析
    目录1. 底层注解@Configuration2. 底层注解@Import3. 底层注解@Conditional1. 底层注解@Configuration @Configuratio...
    99+
    2024-04-02
  • Spring Boot快速搭建Spring框架教程
           Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J...
    99+
    2023-05-31
    spring boot spring框架
  • Spring Boot在Web应用中基于JdbcRealm安全验证过程
    目录正文01-RBAC 基于角色的访问控制02-Shiro 中基于 JdbcRealm 实现用户认证、授权03-集成到 Spring Boot Web 应用中04-总结正文 在安全...
    99+
    2023-02-10
    Spring Boot JdbcRealm安全验证 Spring Boot JdbcRealm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作