菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

spring 核心概述

原创
05/13 14:22
阅读数 405

用 spring,注解是个绕不开的话题。spring-boot 中常用@RestController 与 @Controller 来分置 api 与 web 开发。yii与其思路一致,以不同命名空间下的控制器yii\rest\ActiveController 及 yii\web\Controller ,达到差异化控制。为了最小侵入式,spring-boot 经常使用依赖注入+动态代理,而非是强引用关系的继承,最典型的莫过于 webmvc 中 controller 设计

核心容器

Core Container 由 spring-core , spring-beans , spring-context , spring-context-support和 spring-expression (Spring表达式语言)模块组成

  • Context ( spring-context )模块构建在 Core and Beans 模块提供的坚实基础之上,添加对国际化(例如,使用资源包),事件传播,资源加载以及通过例如Servlet容器透明创建上下文的支持.
  • spring-context-support 支持将常见的第三方库集成到 Spring 应用程序上下文中,用于缓存,邮件(JavaMail),调度(CommonJ,Quartz)和模板引擎(FreeMarker,JasperReports,Velocity)
  • spring-expression 用于在运行时查询和操作对象图,命名变量以及从 Spring 的 IoC 容器中按名称检索对象,列表投影和选择以及常用列表聚合

注解处理流程(JSR269提案)

  1. 编译器把源代码解析生成AST抽象语法树
  2. 注解处理器阶段
  3. 分析和生成,此时前两步完成后,生成字节码(进行类型擦除)

注解处理方式

  • 运行时反射机制
  • Java 提供的 API 来处理编译期的注解

javac编译过程

  1. 解析和填充符号表
    • 解析Parser 词法分析 语法分析
  2. 插入式注解处理器的注解处理
    • jdk1.6+ 插入式注解标准API开发
    • 编译期插入式注解处理器对注解进行处理
  3. 分析与字节码生成

字节码增强

Java字节码增强指的是在Java字节码生成之后,对其进行修改

  1. 修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组
  2. 使修改后的字节码生效
     - 方式一:自定义` ClassLoader` 来加载修改后的字节码
     - 替换掉原来的字节码:在 `JVM` 加载用户的 `Class` 时,拦截,返回修改后的字节码,或者在运行时,使用`Instrumentation.redefineClasses`方法来替换掉原来的字节码
    

java动态代理

JDK的java.lang.reflect.Proxy实现InvocationHandler 接口 动态代理。
spring 的动态代理使用字节码增强,实现了两种代理方式,jdk接口动态,cglib 继承动态。代理策略,基于目标类有否实现接口类,有则默认使用jdk动态代理。没有但强制使用cglib,则用继承式代理。

  • 动态代理核心 将分散的对对象不同方法的调用转发到一个同一的处理函数中
  • 动态代理实现AOP 即在执行函数前和执行函数后都能执行自己定义的钩子
  • 实现RPC
    • PRC本质将函数调用方和函数的提供方分散在两个不同的进程上
    • 中间使用网络通信来进行数据交互,RPC调用其实是对远程另外一台机器进程上的对象的代理
    • 处理中心将调用的信息封装打包,通过网络发送给另外一个进程

JVM 类加载步骤

  1. 加载 通过类的全限定名获取到类的二进制流
  2. 验证 确保Class 文件的字节流中包含的信息符合虚拟机的要求
  3. 准备 为类变量分配内存空间并设置类变初始值
  4. 解析
  5. 初始化 根据用户指定的代码初始化字段和其他资源, 执行 static 块

    Class.forName(className, true, currentLoader) 默认 获取到 Class 对象时, 会自动对类进行初始化
    ClassLoader.loadClass 并不会初始化类,因此类中的静态代码块不会执行

元配置信息

  • bean定义本质上是用于创建一个或多个对象的配方
  • Bean及其之间的依赖关系反映在容器使用的配置元数据中
  • 配置元数据以 XML,Java注解或Java代码(java类)表示

    无论是何种形式的配置,在容器内部是 BeanDefinition 实例来描述依赖

Bean依赖管理

spring 提供了一系列Aware接口 ,允许bean向容器指示它们需要某种基础结构依赖性

接口列表与已注入的依赖关系

  • ApplicationContextAware 声明应用上下文
  • ApplicationEventPublisherAware 封装事件发布者
  • BeanClassLoaderAware 用于加载bean类的类加载器
  • BeanFactoryAware 声明 BeanFactory
  • BeanNameAware 声明bean的名称
  • BootstrapContextAware 资源适配器,通常仅在JCA中可用
  • LoadTimeWeaverAware 定义的weaver(织入)用于在加载时处理类定义
  • MessageSourceAware 用于解析消息的已配置策略
  • NotificationPublisherAware Spring JMX通知发布商
  • PortletConfigAware 当前 PortletConfig 容器运行
  • PortletContextAware
  • ResourceLoaderAware 用于对资源进行低级访问
  • ServletConfigAware
  • ServletContextAware

发表评论

0/200
0 点赞
0 评论
收藏
为你推荐 换一批