spring加载

springApplication构造生成

实例化spring.factories里面声明类型为 ApplicationContextLinitializer和ApplicationListener的一些实现类

加载spring.factories

1:读取项目下的所有spring.factories

2:将读取出的内容存入map,key是左边的声明类,value是右边逗号拼接的类的集合

3:最后放入内存缓存中

根据传入的声明类的类型,实例化所有spring.factories右边的定义类,最终返回。

1:实例化用的是默认构造器反射生成对象,如果实现了ordered接口则会进行排序。

springApplication Run方法

1:加载spring.factories,如果有缓存就直接拿出来。找到SpringApplicationRunListener实例化

EventPublishingRunListener。通过构造器实例化的时候会把application加载好的所有applicationListener存入到EventPublishingRunListener

2:根据不同的流程启动不同的监听器

3:准备spring的配置文件阶段

启动applicationListener,找到所有环境准备阶段需要执行的ApplicationListener包括ConfigApplicationListener等

initializeProfiles()加载存在已经激活的 profiles,有自己设置的则加载自己设置的profiles,存储进入enviroment的mutablePropertySources

load(profile, this::getPositiveProfileFilter,addToLoaded(MutablePropertySources::addLast, false))搜索约定配置文件的位置,循环每个位置,获取每个位置下的文件名称再进行加载,按照文件名称的后缀,获取具体的资源加载器,进行具体文件的加载过程

4:创建springboot用的容器AnnotationConfigServletWebServerApplicationContext

5:刷新spring容器

spring Bean加载 AbstractApplicationContext

1:refresh()

2:prepareRefresh()准备此上下文以进行刷新、设置其启动日期和 active 标志以及执行属性源的任何初始化

3:obtainFreshBeanFactory()设置spring容器唯一id,得到spring的bean工厂 DefaultListableFactory

4:prepareBeanFactory(beanFactory)配置一些基础的上下文加载器和一些后置处理器

5:postProcessBeanFactory(beanFactory)注册ServletContextAwareProcessor处理器,注册request,session

6:(核心)invokeBeanFactoryPostProcessors(beanFactory)注册调用一些核心的beanfactorypostprocessor

实例化并且调用所有已经注册beanFactoryPostprocessor。按需排序。

首先调用beanDefinitionRegistoryPostProcessors。注册bean

CachingMetadataReaderFactoryPostProcessor(beanFactoryPostprocessor)此处会加载一个重要的BeanDefinitionRegistryPostProcessor就是ConfigurationClassPostProcessor(核心类)

此处会调用ConfigurationClassPostPorcessor在已经加载到容器中的bean里面找到带有@Configuration注解的类。即也就是启动类

解析@Configuration注解的类

解析application上的注解,包含@PropertySource,@componentScan,@Import,@ImportResource

当解析到@ComponentScan时扫描项目中所有的@Component注解的类的bean定义加载进入bean工厂。

如果存在@Conditional条件的注解,也会进行相应的过滤不加载

如果没有配置扫描路径,默认的扫描路径时application包路径的前置路径下。此处doScan会扫描包路径下的所有@Component注解类,并且将bean定义注册进入bean工厂

加载所有@component注解的类的bean定义

将@Configuration注解的类进行解析

循环处理配置类configClass直到sourceClass变为null,加载其中嵌套的类

doProcessConfigurationClass的返回值是其参数configClass的父类,

如果该父类是由Java提供的类或者已经处理过,返回null

从配置类解析一切可能的bean形式,内部类,成员方法,@Import等,返回值为父类,继续解析父类直到

处理@Import注解的类,包含ImportSelector导入的类,ImportBeanDefinitionRegistrar导入的类,

如果是@import导入的类的话就默认当作@configuration类处理

处理@Configuration注解类中有@bean注解的方法

将configuration注解的所有嵌套类进行bean定义的加载。

configuration注解等的相关bean定义,项目下的bean定义加载完毕

beanDefinitionRegistoryPostProcessor此处支持扩展

将@configuration注解的类做一层代理

目的是为了解决@Bean单例问题

开始执行beanFactoryPostprocessor

加载占位符配置解析器

7:注册beanpostprocessor

将beanPostProcessor按照顺序一次加载进入beanFactory

将CommonAnnotationBeanPostProcessor,AutoWiredAnnotationBeanPostProcessor重新注入beanfactory在beanpostprocessor列表末尾

8:(核心)刷新beanFactory加载bean

从bean工厂获取到所有的bean定义。加载实例化&初始化

根据beanName获取bean对象

从一,二, 三级缓存中尝试获取已经创建好的实例对象

创建单例实例对象并放入缓存中

根据反射创建bean实例对象放入beanWrapper

查找合适的构造器进行实例化

mergedBeandefinition的后置处理器,有commonAnnotationBeanPostProcessor(处理@PostConstruct,@PreDestroy注解)AutowiredAnnotationBeanPostprocessor(处理@Autowired@Value)

commonAnnotationBeanPostProcessor:析出当前bean类的字段或方法上有@WebServiceRef,@EJB,@Resource,@PostConstruct,@value等注解。获取其注解信息

AutowiredAnnotationBeanPostprocessor:解析出当前bean类的字段上或方法上有@Autowired和@value注解的字段或方法。获取注解信息

将已经创建的bean实例缓存起来。即使它并没有初始化完全。可以解决bean循环引用的问题

bean的属性填充和属性初始化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值