当前位置: 首页 > news >正文

详解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.lryc.cn/news/251216.html

相关文章:

  • 百度/抖音/小红书/微信搜索品牌形象优化怎么做?
  • 爬虫学习(三)用beautiful 解析html
  • OSG编程指南<十四>:OSG纹理渲染之普通纹理、多重纹理、Mipmap多级渐远纹理及TextureRectangle矩阵纹理
  • Langchain-Chatchat的安装过程
  • Windows系列:Windows Server 2012 R2 安装VMware Tools的正确姿势(实现物理机和虚拟机文件互传)
  • 最长连续递增序列
  • FreeRTOS入门--任务
  • 4个解决特定的任务的Pandas高效代码
  • 【已解决】AttributeError: module ‘gradio‘ has no attribute ‘Image‘
  • 高级软件工程15本书籍
  • 计网Lesson3 - 计算机网络评价指标与封包解包
  • 深度学习好文记录,反复学习
  • CSS浅谈动画性能
  • 万能的视频格式播放器
  • 设计模式---第五篇
  • .NET8构建统计Extreme Optimization Numerical Libraries
  • 07-原型模式-C语言实现
  • 深度学习与深度迁移学习有什么区别?
  • 创建Asp.net MVC项目Ajax实现视图页面数据与后端Json传值显示
  • 1089 Insert or Merge (插入排序,相邻归并排序,附模拟实现)
  • 基于算能的国产AI边缘计算盒子8核心A53丨17.6Tops算力
  • Eaxyx 让圆球跟随鼠标移动
  • Node.js 事件循环:定时任务、延迟任务和 I/O 事件的艺术
  • 陪诊系统:基于自然语言处理的患者沟通创新
  • 实用攻略——SD-WAN网络配置步骤详解
  • ​无人机摄影测量
  • 对el-select封装成组件使用
  • pytorch 多卡并行训练
  • C# Bin、XML、Json的序列化和反序列化
  • mediapipe+opencv实现保存图像中的人脸,抹去其他信息