spring 核心概述

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

核心容器

Core Containerspring-core , spring-beans , spring-context , spring-context-supportspring-expression (Spring表达式语言)模块组成

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

spring 核心简述

注解处理流程(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
本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
134
粉丝
24
喜欢
101
收藏
55
排名:106
访问:8.9 万
私信
所有博文
社区赞助商