Spring-IOC容器的创建流程
2021-07-11 10:08:22 6 举报
通过注解方式,从IOC容器的创建到容器创建完成中间所经历的一些重要步骤进行相关描述
作者其他创作
大纲/内容
Object sharedInstance = getSingleton(beanName);先从缓存中获取Bean,能获取到就不用创建,获取不到就需要进行后续的创建过程
prepareBeanFactory(beanFactory);BeanFactory的预准备工作(对BeanFactory进行一些设置)
获取当前Bean依赖的其他Bean;String[] dependsOn = mbd.getDependsOn();如果有就按照getBean()的方式把依赖的Bean先创建出来getBean(dep);
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);获取Bean的定义信息
getEnvironment().validateRequiredProperties();属性校验,检验属性的合法等
IOC容器的创建流程
添加部分的BeanPostProcessor【ApplicationContextAwareProcessor】
getBeanFactory()返回GenericApplicationContext类里的BeanFactory对象【即DefaultListableBeanFactory】
看容器中是否有id为messageSource的组件,如果有类型为MessageSource的组件,赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;MessageSource能取出国际化配置文件中的某个key的值,能按照区域信息获取
拿到InstantiationAwareBeanPostProcessor后置处理器;执行postProcessPropertyValues()方法
设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware。。。作用是这些接口的实现类,不能通过接口类型自动注入
获取Bean的定义信息RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
registerBeanPostProcessors(beanFactory);作用:注册BeanPostProcessor,用于拦截bean的创建
invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;BeanFactoryPostProcessor又叫做BeanFactory的后置处理器。该接口定义了在BeanFactory标准初识化之后执行的方法,主要执行的有这两个接口中的方法:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
onRefresh();留给子容器(子类)子类重写这个方法,在容器刷新的时候可以自定义逻辑
Bean不是抽象的,是单实例的,不是懒加载的
设置BeanFactory的类加载器、以及支持表达式解析器...
是否是InitializingBean接口的实现,执行接口规定的初始化方法
将两种类型的BeanFactoryPostProcessor分别添加到:List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();\t\t\tList<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
不是工厂Bean,利用getBean(beanName);创建对象
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));最终还注册了一个ApplicationListenerDetector后置处理器,用于检查那个后置处理器是监听器的
将创建的ApplicationEventMulticaster添加到BeanFactory中以后其他组件直接自动注入即可
这里的BeanFactoryPostProcessors对Bean的定义信息做了最后的修改和处理,但是Bean还没有初始化,Bean只进行了定义
从BeanFactory中获取applicationEventMulticaster
prepareRefresh();刷新前的预处理工作
this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中一些早期事件
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();告诉子类刷新容器内部的 BeanFactory
register(componentClasses);注册配置类
是否自定义初始化方法;String initMethodName = mbd.getInitMethodName();
创建了一个 this.beanFactory = new DefaultListableBeanFactory();并设置id
AnnotationConfigApplicationContext(Class<?>... componentClasses)
添加编译时的AspectJ支持
判断是否是FactoryBean:是否是实现FactoryBean接口的Bean
getBeanFactory(); 获取BeanFactory
finishBeanFactoryInitialization(beanFactory);实例化所有剩下的单实例bean
refreshBeanFactory();刷新【创建】BeanFactory
beanFactory.preInstantiateSingletons();实例化剩下的单实例bean
initApplicationEventMulticaster(); 初始化事件派发器
refresh();创建刷新容器
postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
拿到InstantiationAwareBeanPostProcessor后置处理器;执行postProcessAfterInstantiation()方法
initMessageSource();作用:初始化MessageSource组件(做SpringMVC国际化功能;消息解析;消息绑定)
派发之前步骤产生的事件
注册可以解析的自动装配;作用是:我们能直接在任何组件中自动注入BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
添加BeanPostProcessor【ApplicationListenerDetector】
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);将每个监听器添加到事件派发器中
this();创建容器
initPropertySources();初始化一些属性设置,里面是空的,留给子类(子容器)自定义个性化的属性设置方法
如果上一步没有配置;就创建一个new SimpleApplicationEventMulticaster(beanFactory)
registerListeners();给容器中将所有项目里面的ApplicationListener注册进来
从容器中拿到所有的ApplicationListener组件
缓存中拿不到就开始Bean的创建流程标记当前bean已经被创建markBeanAsCreated(beanName);
Bean生命周期中初始化前后的行为都在这个方法里面做了
BeanPostProcessor、DestructionAwareBeanPostProcessor、InstantiationAwareBeanPostProcessor、SmartInstantiationAwareBeanPostProcessor、MergedBeanDefinitionPostProcessor不同类型的BeanPostProcessor在Bean创建前后的执行时机是不一样的
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);获取到所有的BeanName
收藏
收藏
0 条评论
回复 删除
下一页