spring容器加载
2020-03-12 17:00:23 44 举报
AI智能生成
spring 容器初始化分解
作者其他创作
大纲/内容
构造<br>new AnnotationConfigApplicationContext()
DefaultResourceLoader-><br> this.classLoader = ClassUtils.getDefaultClassLoader(); <br>
AbstractApplicationContext->this.resourcePatternResolver = getResourcePatternResolver(); <br>
GenericApplicationContext-><br>this.beanFactory = new DefaultListableBeanFactory();<br>初始化构造beanFactory<br>
AbstractAutowireCapableBeanFactory->ignoreDependencyInterface(BeanNameAware.class);<br>容器注册时,忽略实现BeanNameAware接口,setXXX方法的自动注入
AbstractAutowireCapableBeanFactory->ignoreDependencyInterface(BeanFactoryAware.class);<br>容器注册时,忽略实现BeanFactoryAware接口,setXXX方法的自动注入<br>
AbstractAutowireCapableBeanFactory->ignoreDependencyInterface(BeanClassLoaderAware.class);<br>容器注册时,忽略实现BeanClassLoaderAware接口,setXXX方法的自动注入<br>
AnnotationConfigApplicationContext-><br>this.reader = new AnnotatedBeanDefinitionReader(this)<br>创建基于注解的BeanDefinition读取器<br>
registerAnnotationConfigProcessors<br>注册注解配置相关的处理器BeanDefinition
【ConfigurationClassPostProcessor(BeanDefinitionRegistryPostProcessor->BeanFactoryPostProcessor)】
【AutowiredAnnotationBeanPostProcessor(BeanPostProcessor)】
【CommonAnnotationBeanPostProcessor(BeanPostProcessor)】
.org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor(JPA相关)
【EventListenerMethodProcessor(BeanFactoryPostProcessor)】
【DefaultEventListenerFactory(EventListenerFactory)】
核心代码
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);<br>def.setSource(source);<br>beanDefs.add(registerPostProcessor(registry, def, xxxxName))<br>==>registry.registerBeanDefinition(beanName, definition);<br>====>this.beanDefinitionMap.put(beanName, beanDefinition);<br>====>this.beanDefinitionNames.add(beanName);<br>
AnnotationConfigApplicationContext-><br>this.scanner = new ClassPathBeanDefinitionScanner(this)<br>创建BeanDefinition扫描器<br>
ClassPathBeanDefinitionScanner->setEnvironment(environment);
ClassPathBeanDefinitionScanner->setResourceLoader(resourceLoader)
register(componentClasses)
AnnotationConfigApplicationContext-><br>this.reader.register(componentClasses); <br>将定义配置类,注入BeanDefinition容器中<br>
registerBean
doRegisterBean
processCommonDefinitionAnnotations<br>处理通用注解
AnnotationConfigUtils.applyScopedProxyMode
BeanDefinitionReaderUtils.registerBeanDefinition<br>===>registry.registerBeanDefinition
refresh
prepareRefresh<br>刷新前预处理
this.closed.set(false);<br> this.active.set(true);
initPropertySources();<br>初始化属性设置,空方法提供子类重写<br>
getEnvironment().validateRequiredProperties(); <br>检验属性的合法等<br>
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners); <br>初始化早期事件监听器
this.earlyApplicationEvents = new LinkedHashSet<>(); <br>初始化早期事件集合
ConfigurableListableBeanFactory beanFactory <br>= obtainFreshBeanFactory(); <br>获取最新的BeanFactory<br>
refreshBeanFactory<br>
设置Id
getBeanFactory
prepareBeanFactory(beanFactory);<br>BeanFactory的预准备工作<br>对BeanFactory进行一些设置<br>
beanFactory.setBeanClassLoader(getClassLoader())<br>设置类加载器
beanFactory.setBeanExpressionResolver<br>设置表达式解析器
beanFactory.addPropertyEditorRegistrar
beanFactory.addBeanPostProcessor<br>添加Bean后置处理器
【ApplicationContextAwareProcessor(BeanPostProcessor)】
beanFactory.ignoreDependencyInterface<br>容器注册时,忽略实现接口,setXXX方法的自动注入<br><br>
EnvironmentAware<br>
ResourceLoaderAware
EmbeddedValueResolverAware
ApplicationEventPublisherAware
MessageSourceAware<br>
ApplicationContextAware
beanFactory.registerResolvableDependency<br>容器注册时,实现以下接口,字段or参数支持自动注入
BeanFactory
ResourceLoader
ApplicationEventPublisher
ApplicationContext
beanFactory.addBeanPostProcessor<br>添加Bean后置处理器<br>
【ApplicationListenerDetector(BeanPostProcessor)】
beanFactory.registerSingleton<br>ioc容器中,注入组件实例<br>==>this.singletonObjects.put(beanName, singletonObject);
getEnvironment()
getEnvironment().getSystemProperties()
getEnvironment().getSystemEnvironment()
postProcessBeanFactory(beanFactory); <br>BeanFactory前处理,空方法.有子类实现
invokeBeanFactoryPostProcessors(beanFactory); <br>执行BeanFactory后置处理器
判断beanFactory instanceof BeanDefinitionRegistry
获取beanFactoryPostProcessors
BeanDefinitionRegistryPostProcessor处理
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);<br>获取处理器,基类BeanFactoryPostProcessor
排序:PriorityOrdered->Ordered->其他
invokeBeanDefinitionRegistryPostProcessors<br>==>postProcessor.postProcessBeanDefinitionRegistry(registry);<br>
ConfigurationClassPostProcessor<br>
@ComponentScan注解处理
@Import注解出来
@Bean注解处理
invokeBeanFactoryPostProcessors<br>==>postProcessor.postProcessBeanFactory(beanFactory);
BeanFactoryPostProcessor处理
invokeBeanFactoryPostProcessors<br>==>postProcessor.postProcessBeanFactory(beanFactory);
EventListenerMethodProcessor
registerBeanPostProcessors(beanFactory); <br>注册Bean后置处理器
beanFactory.getBean(ppName, BeanPostProcessor.class);<br>beanFactory.addBeanPostProcessor(postProcessor)<br>==>this.beanPostProcessors.add(beanPostProcessor);<br>
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); <br>
initMessageSource(); <br>
initApplicationEventMulticaster(); <br>初始化事件多播器
onRefresh(); <br>初始化bean,空方法,提供子类实现.
registerListeners(); <br>注册监听器
1、从容器中拿到所有的ApplicationListener
2、将每个监听器添加到事件派发器中;<br>getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
3、派发之前步骤产生的事件;
finishBeanFactoryInitialization(beanFactory); <br>
preInstantiateSingletons<br>初始化后剩下的单实例bean<br>
遍历所有this.beanDefinitionNames<br>getBean(beanName);<br>Bean不是抽象的,是单实例的,不是懒加载<br>
doGetBean
Object sharedInstance = getSingleton(beanName); <br>
this.singletonObjects.get(beanName);
this.earlySingletonObjects.get(beanName);
this.singletonFactories.get(beanName);
sharedInstance为空,则开始创建bean
markBeanAsCreated(beanName); 标记创建状态<br>
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); 获取BeanDefinition<br>
String[] dependsOn = mbd.getDependsOn(); <br>获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;<br>
createBean
mbdToUse.prepareMethodOverrides();准备覆盖方法
resolveBeforeInstantiation<br>解析实例化前处理 <br>【InstantiationAwareBeanPostProcessor】
【InstantiationAwareBeanPostProcessor】-><br>applyBeanPostProcessorsBeforeInstantiation<br>
【InstantiationAwareBeanPostProcessor】-><br>applyBeanPostProcessorsAfterInitialization<br>
doCreateBean
instanceWrapper = createBeanInstance(beanName, mbd, args); <br>
applyMergedBeanDefinitionPostProcessors<br>【MergedBeanDefinitionPostProcessor】
【MergedBeanDefinitionPostProcessor】-><br>postProcessMergedBeanDefinition
populateBean(beanName, mbd, instanceWrapper);<br>bean属性赋值 <br>
【InstantiationAwareBeanPostProcessor】-><br>postProcessAfterInstantiation<br>
【InstantiationAwareBeanPostProcessor】-><br>postProcessPropertyValues<br>
====赋值前
applyPropertyValues开始赋值
initializeBean(beanName, exposedObject, mbd);
invokeAwareMethods
BeanNameAware->setBeanName
BeanClassLoaderAware->setBeanClassLoader
BeanFactoryAware->setBeanFactory
applyBeanPostProcessorsBeforeInitialization
遍历执行【BeanPostProcessor】-><br>postProcessBeforeInitialization<br>
invokeInitMethods
InitializingBean->afterPropertiesSet
invokeCustomInitMethod<br>自定义初始化方法<br>
applyBeanPostProcessorsAfterInitialization
遍历执行【BeanPostProcessor】-><br>postProcessAfterInitialization<br>
registerDisposableBeanIfNecessary<br>注册Bean的销毁方法
添加至缓存<br>addSingleton(beanName, singletonObject);<br>==>this.singletonObjects.put(beanName, singletonObject);<br>==>this.singletonFactories.remove(beanName);<br>==>this.earlySingletonObjects.remove(beanName);<br>==>this.registeredSingletons.add(beanName);
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
遍历已创建bean,执行SmartInitializingSingleton->afterSingletonsInstantiated
finishRefresh(); <br>
clearResourceCaches(); <br>清理资源缓存
initLifecycleProcessor();<br>初始化和生命周期有关的后置处理器<br>
默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;<br>如果没有new DefaultLifecycleProcessor();加入到容器;<br>
getLifecycleProcessor().onRefresh();
拿到前面定义的生命周期处理器(BeanFactory);<br>回调onRefresh();<br>
publishEvent(new ContextRefreshedEvent(this));<br>发布容器刷新完成事件;<br>
LiveBeansView.registerApplicationContext(this);
resetCommonCaches(); <br>
0 条评论
下一页