技术问答集录(四)(spring aop Lombok 原理)

摘要:
静态代理由AspectJ表示;动态代理由SpringAOP表示。② SpringAOP:SpringAOP只支持动态代理,它以两种方式实现:JDK动态代理,通过反射实现,只支持实现接口的类的代理,以及CGLib动态字节码注入。

问题:

  1. Spring AOP和Lombok是什么原理?
  2. 如何实现一个自定义的Spring Boot Starter?

1.Spring AOP和Lombok是什么原理?

Spring AOP原理

①AOP: AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。静态代理分为:编译时织入(特殊编译器实现)、类加载时织入(特殊的类加载器实现)。动态代理分为:JDK动态代理(基于接口来实现)、CGLib(基于类实现)。静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

②Spring AOP:Spring AOP只支持动态代理,通过两种方式进行实现:一是JDK动态代理,通过反射实现,只支持对实现接口的类进行代理,二是CGLib动态字节码注入方式实现代理。

java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

JDK动态代理:

JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的,但是JDK中所有要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中有一定的局限性,而且使用反射的效率也不高

 Cglib:

动态生成一个要代理的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截技术拦截所有的父类方法的调用,顺势织入横切逻辑

 ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为

Lombok原理:

定义编译期的注解 @Retention(RetentionPolicy.SOURCE)

利用JSR269 api(Pluggable Annotation Processing API )编译期的注解处理器 (AbstractProcessor在编译时指定一个processor类来对编译阶段的注解进行干预,Lombok的注解处理器:AnnotationProcessor)

利用tools.jar的javac api处理AST(抽象语法树)

将功能注册进jar包

2.如何实现一个自定义的Spring Boot Starter?

手写Spring Boot Starter

思想:主要是@EnableAutoConfiguration注解在启动的时候扫描META-INF 文件下下的spring.factories文件并加载 

免责声明:文章转载自《技术问答集录(四)(spring aop Lombok 原理)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇asp中将文本框内的日期转换成datetime类型的数据MyBatis 物理分页下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android之静态和动态加载Fragment

一、fragment的静态加载和动态加载的理解: 我觉得可以把fragment当做为一个自定义的布局,然后去使用这个定义好的布局,对于静态和动态的理解是,静态是讲在主布局文件中放入fragment布局,然后使用,而动态是不需要在主布局文件中去声明fragment的,而是直接在java代码中去添加。 二、通过一个例子来理解: 说明下下面的图:第一个为主界面,...

这10道springboot常见面试题你需要了解下

1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects 页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。 如果必须启动一个新的Spring项目,我们必须添加构建路径或添加Maven依赖关系,配置应用程序服务器,添加spring配置。...

Spring框架扩展点详解(BeanPostProcessor等)

在日常使用Spring框架的业务开发中,利用框架提供的扩展点完成某些功能的设计是很常见的,了解这些扩展点的原理也对理解框架非常有帮助。这里做一个简单的整理、总结。 1. BeanPostProcessor BeanPostProcessor 接口定义了基本的Bean初始化回调方法,可以实现对应的回调方法来在Spring容器完成Bean的实例化、初始化前后...

element ui的表格列设置fixed后做动态表格出现表格错乱

最近使用element-UI时,使用table做动态表格,当操作列使用fixed时,动态切换表格列设置设置时就会出现错乱,情况如下:  解决方法: 把el-table-column上的key设成一个随机数Math.random(),每次表头设置完都要更新一下就正常,如下 这样,显示结果就正常了...

21.Shiro在springboot与vue前后端分离项目里的session管理

1.前言 当决定前端与后端代码分开部署时,发现shiro自带的session不起作用了。 然后通过对请求head的分析,然后在网上查找一部分解决方案。 最终就是,登录成功之后,前端接收到后端传回来的sessionId,存入cookie当中。 之后,前端向后端发送请求时,请求Head中都会带上这个sessionid。 后端代码通过对这个sessionid的解...

Echarts图表在VUE项目中使用动态数据源

动态数据源问题:目前我使用的方法是当后台查询到数据时,直接传递给option中的对应data内; 例如柱状图,可以直接将x轴数据注入到 this.option.xAxis.data 中,如 this.option.xAxis.data.push(res.result[i].属性) 其中括号内为获取的要注入的值,该条语句直接放置在循环中,将结果中的数据全部注...