详解Spring中基于注解的Aop编程以及Spring对于JDK和CGLIB代理方式的切换

 

😉😉 学习交流群:

✅✅1:这是孙哥suns给大家的福利!

✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料

🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取!

🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞

一:基于注解的AOP编程

        从jdk5.0之后就java就引入了注解的开发,作为spring框架来讲,支持基于注解进行aop开发,但其核心仍然是aop的标准开发步骤。所以,仍然包括那四步

1:原始对象

        原始对象这一块,仍然需要在配置文件中配置这个对象。

        下边的三个步骤其实就是为了创建组装切面。切面是由切入点和额外功能组装而成,要想构建切面现有额外功能,再有切入点,在进行组装就好了,所以,后三个过程就是为了创建切面。在基于注解的开发过程中它所定义的切面就是一个切面类。我们创建一个MyAspect这样的切面类。想要表达这个类是一个切面类的话我们需要一个这样的注解,@Aspect这样的注解,一旦我们的类加上这个注解之后,这个类就成了切面类,切面类中包含额外功能和切入点。

2:额外功能

        需要在切面类上增加一个@Aspect注解,通过这个注解,就可以定义这是一个切面类,但凡是一个切面,都必须要有额外功能和切入点,这样才能组成切面,如何才查看?
        在切面类当中如何定义一个切面方法,这个额外功能的方法可以随意命名,但是上边必须要有一个@Around注解,这里的注解就替换了之前实现接口的问题

3:切入点

        通过切面定义了额外功能,@Around通过切面类也定义了切入点@Around(excution(* login(..))),@Aspect定义了切面类。这样所有的内容就和xml开发模式匹配了。我们需要将切面类交由Spring进行创建对象还需要告诉Spring我们现在是基于注解开发Spring的AOP**

二:注解开发的基本示例

package com.spring.aspect;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;/*** @Auther: DaShu* @Date: 2021/6/28 21:54* @Description:*/
@Aspect
public class MyAspect {/*** ProceedingJoinPoint这个等效于MethodInvocation* 这里写的是额外功能的部分,现在的额外功能不需要实现接口了,只需要加入注解。* */@Around("execution(* login(..))")public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("--------------aspect log-----------");Object proceed = joinPoint.proceed();return proceed;}
}
    <!--这里是原始对象--><bean id="userService" class = "com.spring.aspect.UserServiceImpl"/><!--这里边既体现了额外功能,又体现了切入点--><bean id ="around" class = "com.spring.aspect.MyAspect"/><!--告知Spring我们现在是基于注解进行Spring编程了--><aop:aspectj-autoproxy/>```


        如何做多个额外功能 & 切入点复用?
        在以上基础写法的基础上进行修改,修改MyAspect这个类,其他保持一致。所谓的切入点复用,就是在切面类中定义一个函数,这个函数上边加上@Point注解,后续更加附加功能有利于切入点的复用。

package com.spring.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;/*** @Auther: DaShu* @Date: 2021/6/28 21:54* @Description:*/
@Aspect
public class MyAspect {//定义一个公共切入点表达式@Pointcut("execution(* login(..))")public void myPointcut(){}/*** ProceedingJoinPoint这个等效于MethodInvocation* 这里写的是额外功能的部分,现在的额外功能不需要实现接口了,只需要加入注解。* */@Around(value="myPointcut()")//在这里调用切入点表达式,就完成了整合。public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("--------------aspect log-----------");Object proceed = joinPoint.proceed();return proceed;}@Around(value="myPointcut()")public Object arround1(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("--------------aspect tx-----------");Object proceed = joinPoint.proceed();return proceed;}
}


三:Spring对于JDK和Cglib动态代理的切换

        Aop底层是实现过程中一共有两种实现方式,一种是jdk的,通过实现接口做新的实现类的方式 创建代理对象,Cglib他是通过继承父类的方式来做新的子类来创建最终的代理对象,这种基于注解的AOP代理方式,他最底层是应用那种方式呢?它里边的代理类使用debugger来查看的话是proxy这个代理jdk来做的,默认情况下Aopbiancheng 底层用用的事JDK的动态代理方式,如果切换CGLIB应该怎么办?引入proxy-target-class="true"这个属性就好了,就可以实现切换了,当然这种增加属性的这种方式只适用于针对注解的开发方式**

  <!--告知Spring我们现在是基于注解进行Spring编程了--><!--proxy-target-class="true"属性默认不写是false,使用JDK代理,指定为TRUE,则使用CGLIB动态代理--><aop:aspectj-autoproxy proxy-target-class="true"/>

        如果按照传统的AOP开发应该怎么修改呢?

        我們要知道无论是基于注解的还是传统的Aop开发都是默认是JDK动态代理,传统的方式想要切换也是在配置文件中进行配置,配置方式是:
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《管家婆》辉煌2005+(V4.0)简单教程

《管家婆》辉煌2005&#xff08;V4.0&#xff09;简单教程 呉師傅 运行环境&#xff1a;   操作系统推荐使用Win2000&#xff08;32位&#xff09;、WinXP&#xff08;32位&#xff09;、Win7&#xff08;位&#xff09; 兼容&#xff1a;Win7&#xff08;64位&#xff09…

机器学习笔记 - 异常检测之OneClass SVM算法简述

一、异常检测是什么? 如下图,理想中我们可以找到一个框住大部分正常样本的决策边界,而在边界外部的数据点(蓝点)即视为异常。 但实际情况下数据都没有标签,因此很难定义正常还是不正常。异常检测的主要挑战如下:正常与异常行为之间的界限往往并不明确、不同的应…

一文搞懂设计模式之责任链模式

大家好&#xff0c;我是晴天。我们又见面了&#xff0c;本周我们继续学习设计模式&#xff0c;本周将同大家一起学习责任链模式。 场景引入 我们回想一下自己曾经经历过的考学场景&#xff0c;我们是如何一步一步考上大学的&#xff08;为了简化过程只提取核心环节&#xff09…

Fiddler抓包工具之fiddler的命令行窗口用法

fiddler的命令行窗口的相关命令 在fiddler官网有QuickExec使用教程&#xff0c;地址是QuickExec Reference - Fiddler Classic QuickExec 命令行窗口位于fiddler左下角黑色输入框&#xff0c;如下图&#xff1a; 按ALT Q&#xff0c;将焦点快速设置到QuickExec框。如果Fiddl…

代码随想录第二十二天(一刷C语言)|组合总数电话号码的字母组合

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、组合总数 思路&#xff1a;参考carl文档和视频 1、需要一维数组path来存放符合条件的结果&#xff0c;二维数组result来存放结果集。 2、targetSum 目标和&#xff0c;也就是题目中的…

Python语言学习笔记之七(JOSN应用)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、认识Json JSON (JavaScript Obiect Notation)是一种轻量级的数据交换格式&#xff0c;它是ECMAScript的一…

电源需要考虑的因素

做产品的都离不开电源&#xff0c;产品出问题也首先检查供电是否正常。今天给大家分享的是做好一个电源需要考虑哪些因素。 一&#xff0e; 描述输入电压影响输出电压几个指标形式 1&#xff0e; 稳压系数 A&#xff0e;稳压系数&#xff1a;表示负载不变时&#xff0c;稳压电源…

爬虫学习-基础(HTTP原理)

目录 一、URL和URI 二、HTTP和HTTPS &#xff08;1&#xff09;HTTP &#xff08;2&#xff09;HTTPS &#xff08;3&#xff09;HTTP与HTTPS区别 &#xff08;4&#xff09;HTTPS对HTTP的改进&#xff1a;双问的身份认证 三、TCP协议 &#xff08;1&#xff09;TCP三次握手…

vue项目node-sass^4.14.1 python gyp 报错解决办法

npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass/参考链接&#xff1a;链接

浅析 TLS(ECDHE)协议的握手流程(图解)

浅析 TLS&#xff08;ECDHE&#xff09;协议的握手流程&#xff08;图解&#xff09; 通过 wireshark 抓取 HTTPS 包&#xff0c;理解 TLS 1.2 安全通信协议的握手流程。 重点理解几个点&#xff1a; TLS 握手流程&#xff1a;通过 wireshark 抓取 HTTPS 包理解。协商加密&a…

一文解决msxml3.dll文件缺失问题,快速修复msxml3.dll

在了解问题之前&#xff0c;我们必须首先清楚msxml3.dll到底是什么。DLL&#xff08;Dynamic Link Libraries&#xff09;文件是Windows操作系统使用的一个重要组成部分&#xff0c;用于存储执行特定操作或任务的代码和数据。msxml3.dll为Windows系统提供处理XML文档的功能。如…

文件上传---阿里云OSS

1.注册阿里云账户&#xff08;注册完成后需要实名认证&#xff09; 2.注册完账号之后&#xff0c;就可以登录阿里云 3. 创建bucket 4.创建 AccesskeyId 选择自己的开发语言 5. 阿里云Oss工具类 package com.sky.utils;import com.aliyun.oss.ClientException; import com.ali…

Redis缓存的使用

什么是缓存 缓存就是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较高。 缓存的作用&#xff1a; 降低后端负载提高读写效率&#xff0c;降低响应时间 缓存的成本&#xff1a; 数据一致性成本代码维护成本运维成本 Redis特点 键值型数据库…

Upsert 及冲突(GORM)

GORM支持了数据库的upsert操作 upsert操作对于插入一条数据而言的&#xff0c;如果插入数据之前&#xff0c;没有这条数据&#xff0c;则会插入该条数据&#xff1b;如果插入数据之前就存在这条数据&#xff08;索引值&#xff09;&#xff0c;就更新这条记录。 创建结构体 …

基于景区智慧灯杆、智能指路牌基础设施的景区建设应用

智慧景区是指运用现代信息技术手段&#xff0c;将景区内的资源、服务、管理等进行数字化、网络化和智能化整合&#xff0c;打造出高效便捷、安全舒适、互动体验和可持续发展的景区。智慧景区可以从以下几个方面进行体现&#xff1a; 智慧导览&#xff1a;通过使用智能化的导览…

vue 解决响应大数据表格渲染崩溃问题

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.场景描述 发起请求获取上万条数据&#xff0c;进行表格渲染&#xff0c;使浏览器卡顿&#xff0c;导致网页崩溃。 2.分析原因 1.大量数据加载&#xff0c;过多操作Dom&#xff0c;消耗性能。 2.表格中包含其他…

Linux 基础认识

文章目录 前言Linux历史window历史Linux地位发行版本 前言 建议只看概述 Linux历史 概述&#xff1a; 由一个研究生受Minix操作系统启发编写的&#xff0c;因为功能实用&#xff0c;代码开源被世界人接收和开发 &#xff0c;最终正式发布 。 详情&#xff1a; 1991年10月5日…

Azure Machine Learning - 在 Azure AI 搜索中创建全文查询

Azure AI搜索中如果要为全文搜索生成查询&#xff0c;本文提供了设置请求的步骤。 本文还介绍了查询结构&#xff0c;并说明了字段属性和语言分析器如何影响查询结果。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&a…

【开源威胁情报挖掘1】引言 + 开源威胁情报挖掘框架 + 开源威胁情报采集与识别提取

基于开源信息平台的威胁情报挖掘综述 写在最前面摘要1 引言近年来的一些新型网络安全威胁类型挖掘网络威胁的情报信息威胁情报分类&#xff1a;内、外部威胁情报国内外开源威胁情报挖掘分析工作主要贡献研究范围和方法 2 开源威胁情报挖掘框架1. 开源威胁情报采集与识别2. 开源…

详解SpringAop开发过程中的坑

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…