Spring之启动过程源码解析

代码走读

AnnotationConfigApplicationContext->refresh->prepareRefresh->
1.getEnvironment().validateRequiredProperties();主要是校验环境变量配置信息,有哪些必须的key没有,那么就会报错
2.监听器相关的,后面回过头记录笔记

AnnotationConfigApplicationContext->refresh->obtainFreshBeanFactory->refreshBeanFactory->refreshBeanFactory是模板方法,当前类提供一个空方法,等待子类去重写,回头调用的时候,先去调用父类的方法,父类方法为空,那么就会去调用子类的方法。


AnnotationConfigApplicationContext->refresh->prepareBeanFactory->
// Prepare the bean factory for use in this context.
// 准备BeanFactory
// 1. 设置BeanFactory的类加载器、SpringEL表达式解析器、类型转化注册器
// 2. 添加三个BeanPostProcessor,注意是具体的BeanPostProcessor实例对象
// 3. 记录ignoreDependencyInterface
// 4. 记录ResolvableDependency
// 5. 添加三个单例Bean
1.setBeanExpressionResolver解析@Autowired("#{XXX}")表达式
2.addPropertyEditorRegistrar添加类型转换器
3.addBeanPostProcessor 组成一个BeanPostProcessor,用来处理EnvironmentAware、EmbeddedValueResolverAware等回调
4.ignoreDependencyInterface如果一个属性对应的set方法在ignoredDependencyInterfaces接口中被定义了,则该属性不会进行自动注入(是Spring中的自动注入,不是@Autowired)
5.registerResolvableDependency处理依赖的Bean

AnnotationConfigApplicationContext->refresh->invokeBeanFactoryPostProcessors
// BeanFactory准备好了之后,执行BeanFactoryPostProcessor,开始对BeanFactory进行处理
// 默认情况下:
// 此时beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的BeanDefinition
// 而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor
// 这里会执行ConfigurationClassPostProcessor进行@Component的扫描,扫描得到BeanDefinition,并注册到beanFactory中
// 注意:扫描的过程中可能又会扫描出其他的BeanFactoryPostProcessor,那么这些BeanFactoryPostProcessor也得在这一步执行

AnnotationConfigApplicationContext->refresh->registerBeanPostProcessors
//将扫描到的BeanPostProcessors实例化并排序,并添加到BeanFactory的beanPostProcessors属性中去

AnnotationConfigApplicationContext->refresh->initApplicationEventMulticaster
设置ApplicationContext的applicationEventMulticaster,么是用户设置的,要么是SimpleApplicationEventMulticaster

AnnotationConfigApplicationContext->refresh->registerListeners
把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件

AnnotationConfigApplicationContext->refresh->finishBeanFactoryInitialization
创建非懒加载的bean,保存到单例池

AnnotationConfigApplicationContext->refresh->finishRefresh

事件监听器

1.对spring而言,如何判断一个类型是不是事件监听,通过beanPostProcess,ApplicationListenerDetector就是检查一个bean是不是ApplicationListener,它是在prepareBeanFactory阶段添加进来的

 2.事件监听有两种方式,

a.实现ApplicationListener接口

b.在Bean对象里面添加@EventListener注解,是EventListererMethodProcessor实现的,最后也会构造称为applicationListener,最后加到对应的容器里面

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值