Spring容器的refresh()[创建刷新],
ioc容器就是一些Map;很多的Map里面保存了单实例Bean,环境信息
详细的知识和spring的其他原理请看我的博客:https://blog.csdn.net/wang121213145/article/details/123953486
1.prepareRefresh()刷新前的预处理;
- initPropertySources();初始化一些属性设置;子类自定义个性化的属性设置方法;
- getEnvironment().validateRequiredProperties();检验属性的合法等;
- this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的事件;
2.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();创建获得BeanFactory对象[DefaultListableBeanFactory];
3.prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)
- 设置BeanFactory的类加载器、支持表达式解析器
- 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
- 设置忽略的自动装配的接口【EnvironmentAware】
- 注册可以解析的自动装配;我们能直接在任何组件中自动注入【BeanFactory、ApplicationEventPublisher、…】
- 添加BEanPostProcessor【ApplicationListenerDetector】
- 添加编译时的AspectJ
- 给BeanFactory中注册一些能用的组件;【environment、…】
4.postProcessBeanFactory(beanFactory);子类通过重写这个方法在BeanFactory创建并预准备完成以后做进一步设置
5.invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor;
俩个接口:BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor
- 先执行BeanDefinitionRegistryPostProcessor的方法;
获取所有的BeanDefinitionRegistryPostProcessor;优先执行实现PriorityOrdered接口的;然后执行实现Ordered接口的;最后执行剩下的 - 先执行BeanFactoryPostProcessor的方法;
获取所有的BeanDefinitionRegistryPostProcessor;优先执行实现PriorityOrdered接口的;然后执行实现Ordered接口的;最后执行剩下的
6.registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器),不同接口类型的BeanPostProcessor,在Bean创建前后执行的时机是不一样的
BeanPostProcessor
DestructionAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor
MergedBeanDefinitionPostProcessor【internalPostProcessors】
- 获取所有的BeanostProcessor;先注册实现PriorityOrdered的;然后注册实现Ordered接口的;然后注册剩下的;最终注册MergedBeanDefinitionPostProcessor
- 注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是,则this.applicationContext.addApplicationListener((ApplicationListener<?>) bean)
7.initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定;消息解析)
- 获取BeanFactory
- 看容器中是否又id为messageSource的,类型是MessageSource的组件
如果有赋值给messageSource ,如果没有自己创建一个DelegatingMessageSource;
MessageSource:取出国际化配置文件中的某个key的值;能按区域信息获取; - 把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
8.initApplicationEventMulticaster();初始化事件派发器
9.onRefresh();留给子容器(子类),子类重写这个方法,在容器刷新的时候可以自定义逻辑;
10.registerListeners();给容器中将所有项目的ApplicationListener注册进来;
- 从容器中拿到所有的ApplicationListener;
- 将每个监听器添加到事件派发器中;getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
- 派发之前步骤中产生的事件;
11.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;
-
beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean
1.获取容器中所有的Bean,依次进行初始化和创建对象 2.获取Bean的定义信息;RootBeanDefinition 3.Bean不是抽象的,是单实例,不是懒加载 4.如果不是FactoryBean,利用getBean(beanName)创建对象。 5.doGetBean(); 6.private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);先从获取缓存中保存的单实例Bean。如果能够获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来) 7.缓存中获取不到,开始Bean的创建对象流程; 8.标记当前bean已经被创建; 9.获取Bean的定义信息; 10.获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来; 11.启动bean的创建流程createBean(beanName,mbd,args); 12.Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;InstantiationAwareBeanPostProcessors提前执行;先触发postProcessBeforeInstantiation();如果有返回值,触发postProcessAfterInitialization();
-
InstantiationAwareBeanPostProcessors()如果没有返回Bean实例,继续下面流程;
-
调用applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
-
调用populateBean(beanName, mbd, instanceWrapper),对bean属性进行赋值;
-
InstantiationAwareBeanPostProcessors()触发postProcessPropertyValues()
-
应用Bean属性的值;为属性利用setter方法进行复制;applyPropertyValues(beanName, mbd, bw, pvs);
-
【Bean初始化】initializationBean(beanName,exposedObject,mbd);
-
【执行Aware接口方法】invokeAwaremethods(beanName,bean);
-
【执行后置处理器初始化之前】wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
-
【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);是否是InitializingBean接口的实现;执行接口规定的初始化;是否自定义初始化方法;
-
【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
-
注册Bean的销毁方法;
-
将创建的Bean添加到缓存中singletonObjects;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75464.html