spring最核心的组件是BeanFactory,看了源码才发现,BeanFactory并非定义在spring-core中,那spring-core都有啥东东?
spring-core主要提供以下服务,为BeanFactory的定义提供基础服务。
1, ConversionService
ConversionService.png
提供可配置的类型转换服务
Converters.png依赖内部的注册表,
DefaultConversionService.png默认支持的类型转换
查找匹配的Converter
find-1.png find-2.png
2, Environment
PropertySource:任何能提供key-value查找能力的数据源
MutablePropertySources:PropertySource集合,可动态增删
profile:bean定义的逻辑分组,一个profile表示一组bean,只有active的profile对应的bean才会注册到bean容器里。
Environment:继承PropertyResolver,依赖内部的MutablePropertySources提供key查找服务,存储当前active的profile。Environment表示用profile标识的一组key-value,作为其他关联到profile的组件(bean定义)的Context。
StandardEnvironment默认支持系统属性和系统变量
profile.png如果profile没有显示指定,默认从当前Environment的key值spring.profiles.active获取,逗号分割。
StandardServletEnvironment.pngStandardServletEnvironment属性源中额外添加了ServletContext和ServletConfig中的key-value。
3, Resource
资源就是一个基于各种协议+特定路径的InputStream
协议.png
FileUrlResource:基于文件路径的资源
FileUrlResource-1.png FileUrlResource-2.png
ClassPathResource:
ClassPathResource-1.png ClassPathResource-2.png
4, 序列化和反序列化
默认基于jdk的序列化.png 默认基于jdk的反序列化.png
5, 访问类型元数据:可以不加载类,直接解析字节码,spring boot应用类型推断的基础。
类元数据.png 类和方法及其注解元数据.png 基于反射.png
基于反射实现的标准元数据
基于asm.png
基于asm直接解析字节码,不需要加载class,这就是打开spring boot源码各种类未定义但是程序可以运行的原因。类在字节码执行过程中遇到了才会加载,使用类的方法首先要有对象,构造对象的任务都委托给了spring的BeanFactory,在spring boot中BeanFactory首先会检查注解中的条件是否满足,指定的类是否可以使用classloader加载,不满足条件的不加载,就算字节码无法编译通过,只要不加载就不会影响程序运行。
网友评论