zoukankan      html  css  js  c++  java
  • 技术问答集录(四)(spring aop Lombok 原理)

    问题:

    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文件并加载 

  • 相关阅读:
    Android 开发学习进程0.19 webview 的使用
    2020年4到6月—7家公司面试总结(3家已拿offer)
    iOS今日头条第3轮面试回忆
    [搬运]Dart之枚举中使用扩展
    Proguard 常用规则
    shiro安全框架
    Android服务的AIDL跨进程(程序)操作
    Android——服务的实例,银行服务
    Android四大组件之服务————服务的生命周期和启动方式
    Android 程序间的广播和Manifest找不到(解决方法)
  • 原文地址:https://www.cnblogs.com/fanBlog/p/13427340.html
Copyright © 2011-2022 走看看