Spring实例化
2020-04-22 10:27:40 0 举报
SpringBean的初始化过程
作者其他创作
大纲/内容
MergedBeanDefinitionPostProcessor-postProcessMergedBeanDefinition找出并缓存对象的注解信息,主要是自动注入
第二个registerBeanPostProcessors注册Spring当中的后置处理器(包括程序员提供的)
BeanFactoryPostProcessor-ConfigurationClassPostProcessor-postProcessBeanFactory
SmartInstantiationAwareBeanPostProcessor-determineCandidateConstructors推断构造方法
第一个invokeBeanFactoryPostProcessors执行用户和Spring提供的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的实现类
spring的bean的实例化过程,注意是实例化过程,实例化过程包含初始化,其实严格意义上讲上面的所有也算bean的实例化过程
类的扫描(扫描包含普通扫描,也包含@Bean扫描)和类的解析成beanDefinition对象,比如Import的解析也在这个方法里面
这个阶段一般我们不会提供BeanDefinitionRegistryPostProcessor,如何扩展,参考mybatis的公开课
applyMergedBeanDefinitionPostProcessors
实例化一些功能性对象AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner
BeanDefinitionRegistryPostProcessor-ConfigurationClassPostProcessor-postProcessBeanDefinitionRegistry
BeanPostProcessor-postProcessBeforeInitialization这个方法比较简单
InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation判断对象是否需要填充属性
这个阶段,Springj基本没有提供扩展点给程序员,所以程序员不需要在这个阶段对Spring进行扩展
finishBeanFactoryInitialization初始化剩下的单例bean
BeanPostProcessor-postProcessAfterInitializationAOP的代理就是通过这个方法来完成的
父类的构造方法new DefaultListableBeanFactory()对bean工厂的初始化,为何要初始化?因为beanFactory当中有很多重要的属性,比如单例池
AnnotationConfigApplicationContext的无参构造方法,无参构造方法里面,往beanDefinitionMap中注册很多beanDefinition,其中最重要的就是ConfigurationClassProcessor,这个类应该是Spring中最重要的几个类之一
refresh();重要的是三个
InstantiationAwareBeanPostProcessor-postProcessPropertyValues完成装配,即完成属性的注入,也是大家常说的自动注入
第三个finishBeanFactoryInitializationfinishBeanFactoryInitialization初始化单例bean
populateBean填充属性,自动注入
register(annotatedClasses),注册配置类,这里仅仅注册一个配置类到beanDefinitionMap中,方面后面实例化这个配置类,配置类为何要实例化?首先配置类也是一个bean,自然也要实例化,其次配置类里面加了很多@Bean的方法,需要进行cglib代理,所以一定要实例化。为何需要cglib代理,参考公开课,视屏里说的几个创世纪的类,其实是在无参构造方法那里注册的。
spring的bean的初始化过程注意初始化过程包含在实例化过程当中
对象被new出来了(仅仅是一个寡对象,没有属性)
判断我们的配置类是不是全配置类full,如果是full需要给配置类加上cglib代理
invokeInitMethods--执行Spring生命周期方法--init
doCreateBean->createBeanInstance
0 条评论
下一页