spring-beans

加载spring上下文涉及三个步骤:this(),reigister(componentClasses),refresh()

this()方法

 1.隐式调用父类的构造方法,初始化一个bean工厂 DefaultListableBeanFactory

2.会在AnnotatedBeanDefinitionReader注入一些后置处理器

org.springframework.context.annotation.internalConfigurationAnnotationProcessor(ConfigurationClassPostProcessor很重要的一个)

org.springframework.context.annotation.internalAutowiredAnnotationProcessor(跟属性填充相关)

org.springframework.context.annotation.internalCommonAnnotationProcessor

org.springframework.context.event.internalEventListenerProcessor

org.springframework.context.event.internalEventListenerFactory

ConfigurationClassPostProcessor为例子:

 

 所以 DefaultListableBeanFactory就是容器,里面放着beanDefinitionMap,beanDefinitionNames,beanDefinitionMap是一个hashMap,beanName作为Key,beanDefinition作为Value,beanDefinitionNames是一个集合,里面存放了beanName。

AnnotationConfigApplicationContext的依赖图

DefaultListableBeanFacotry类图

reigister(componentClasses)

AnnotatedBeanDefinitionReader的doRegisterBean方法,把传入的类进行注册,可以注册多个。 spring会把带@Configuration的成为Full类--此处进行注册,不带@Configuration的称为Lite类。

 最终调用org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition)的 将配置类注册

 经历了register放法后,自己的配置类,注册进来:

 此时spring里面除了内置的类,有了我们自己的bean,也就是我们自己的配置类而且spring还没有开始扫描,只是实例化了一个工厂 。而且singletonObjects没有东西。

refresh()

 3.1 invokeBeanFactoryPostProcessors(beanFactory)

 最终调用的org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory, List<BeanFactoryPostProcessor>)方法:

这个方法里面主要处理BeanDefinitionRegistryPostProcessors和BeanFactoryPostProcessor。

 将BeanDefinitionRegistryPostProcessors分为PriorigyOrdered,Ordered and the rest的,然后依次调用invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);由于BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor,所以会在最后调用invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

 在这个里面 最重要的一个就是ConfigurationClassPostProcessor:

 它会真正的处理解析配置类

处理步骤:

1. 获取所有的beanName,然后循环遍历 找出@Configuration标注的类,此处我们找到了MainConfig. 

2.设置BeanName的生成方式,并实例化配置类的解析器ConfigurationClassParser 

3.循环遍历所有的配置类,完成解析

 处理@Component @PropertySource @ComponentScan @ComponentScans

 @Import @ImportResource

 

 最后调用invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

此时还是只有ConfigurationClassPostProcessor,Configuration标注的配置类,会创建CGLIB代理 ,同时增加一个BeanPostProcessor:ImportAwareBeanPostProcessor

enhanceConfigurationClasses(beanFactory):

 

执行完后,发现:

 

将BeanFactoryPostProcessors 也按照PriorityOrdered ,Ordered and the rest区分开来,依次调用invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); 

 此处只有一个EventListenerMethodProcessor:

此时BeanFactory里面还没有我们自己的Bean: 

 

3.2 registerBeanPostProcessors(beanFactory);

注册BeanPostProcessor---CommonAnnotationBeanPostProcessor 和AutowiredAnnotationBeanPostProcessor 同时增加了一个BeanPostProcessorChecker

执行完后BeanPostProcessor为:

3.3 finishBeanFactoryInitialization(beanFactory); 实例化所有的非懒加载单例be an

目前一级缓存中的:

遍历所有的beanName, 判断是否可以实例化,通过getBean方法最终调用到

 doGetBean, 会先从singleton中先获取(一级缓存),对于一些内置类 直接从一级缓存中能够获取到。

 获取不到的话,就执行createBean 

最终会调用org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[]) 完成实例化,属性赋值 和 初始化。这期间会执行很多BeanPostProcessor.

doCreateBean之前,调用resolveBeforeInstantiation---这里会完成AOP的Advisor的解析和缓存(org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(Class<?>, String))。

doCreateBean里面:

createBeanInstance(beanName, mbd, args);--实例化调用反射

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(String, RootBeanDefinition, BeanWrapper)---属性赋值

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition)---完成初始化

总结bean的生命周期:

1.实例化Bean对象,这个时候Bean的对象是非常低级的,基本不能够被我们使用,因为连最基本的属性都没有设置,可以理解为连Autowired注解都是没有解析的;

2.填充属性,当做完这一步,Bean对象基本是完整的了,可以理解为Autowired注解已经解析完毕,依赖注入完成了;

3.如果Bean实现了BeanNameAware接口,则调用setBeanName方法;

4.如果Bean实现了BeanClassLoaderAware接口,则调用setBeanClassLoader方法;

5.如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory方法;

6.调用BeanPostProcessor的postProcessBeforeInitialization方法;

7.如果Bean实现了InitializingBean接口,调用afterPropertiesSet方法;

8.如果Bean定义了init-method方法,则调用Bean的init-method方法;

9.调用BeanPostProcessor的postProcessAfterInitialization方法;当进行到这一步,Bean已经被准备就绪了,一直停留在应用的上下文中,直到被销毁;

10.如果应用的上下文被销毁了,如果Bean实现了DisposableBean接口,则调用destroy方法,如果Bean定义了destory-method,声明了销毁方法也会被调用

 

它会真正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值