spring-core

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.png

StandardEnvironment默认支持系统属性和系统变量

profile.png

如果profile没有显示指定,默认从当前Environment的key值spring.profiles.active获取,逗号分割。

StandardServletEnvironment.png

StandardServletEnvironment属性源中额外添加了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加载,不满足条件的不加载,就算字节码无法编译通过,只要不加载就不会影响程序运行。

你可能感兴趣的:(spring-core)