Spirng3.2.12源码详细解析
2015-05-28 09:46
169 查看
一、ContextLoaderListener上下文加载器的监听器
调用contextInitialized
1.以自身为一个加载器initWebApplicationContext(参数为Servlet容器)
2.为this.context初始化 XmlWebApplicationContext默认,(可通过web.xml配置文件配置上下文容器的具体实例,暂时不需要)初始化过程为BeanUtils.instantiateClass(contextClass)
contextClass是通过spring自带的配置文件获取的。
3.激活this.context
可加载context的父上下文
this.context.setId("/Boxing_Plan" )
setServletContext
setConfigLocation( "classpath*:config/spring-*.xml"){
getEnvironment() ->StandardServletEnvironment resolveRequiredPlaceholders
newPropertySourcesPropertyResolver(new MutablePropertySources(this.logger))
}
getEnvironment().initPropertySources(sc,null)
customizeContext(sc,wac)
this.context.refresh() [最为重要的方法]
二、XmlWebApplicationContextXml的Web应用容器 refresh()方法
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal beanfactory.
ConfigurableListableBeanFactorybeanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
// Allows post-processing of the bean factory in contextsubclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific contextsubclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
1. prepareRefresh();
initPropertySources();{
获取容器的Environment(早在ClassLoaderListenersetConfigLocation已初始化)
WebApplicationContextUtils.initServletPropertySources
}
getEnvironment().validateRequiredProperties();{
validateRequiredProperties()
validateRequiredProperties()
}
2. beanFactory =obtainFreshBeanFactory()
refreshBeanFactory();{
beanFactory =createBeanFactory()->new DefaultListableBeanFactory(null)
setSerializationId()---org.springframework.web.context.WebApplicationContext:/BoxingPlan
setAutowireCandidateResolver-->new QualifierAnnotationAutowireCandidateResolver()
loadBeanDefinitions()[重要]{
beanDefinitionReader= new XmlBeanDefinitionReader(beanFactory);
beanDefinitionReader.setEnvironment(getEnvironment())
setResourceLoader(this)
setEntityResolver(newResourceEntityResolver(this))
}
loadBeanDefinitions(beanDefinitionReader)[重要]{
getConfigLocations()[classpath*:config/spring-*.xml]
reader.loadBeanDefinitions("classpath*:config/spring-*.xml")
//具体介绍reader 加载bean的方法
XmlBeanDefinitionReader
loadBeanDefinitions(String){
getResourceLoader()->XmlWebApplicationContext
(ResourcePatternResolver)resourceLoader.getResources("classpath:..")
(InputSource)encodedResource.getResource().getInputStream()
确认验证模式VALIDATION_DTDVALIDATION_XSD
Documentdoc = this.documentLoader.loadDocument(
documentReader= createBeanDefinitionDocumentReader()->DefaultBeanDefinitionDocumentReader
newXmlReaderContext(resource)
documentReader.registerBeanDefinitions(doc,xmlReaderContext)
........
....
}
}
}
3. prepareBeanFactory(beanFactory);{
beanFactory.setBeanClassLoader
beanFactory.setBeanExpressionResolver(newStandardBeanExpressionResolver());
beanFactory.addPropertyEditorRegistrar(newResourceEditorRegistrar(this, getEnvironment()));
beanFactory.addBeanPostProcessor(newApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface{
ResourceLoaderAware.class
ApplicationEventPublisherAware.class
MessageSourceAware.class
ApplicationContextAware.class
EnvironmentAware.class
}
beanFactory.registerResolvableDependency{
BeanFactory.class,beanFactory
ResourceLoader.class,this
ApplicationEventPublisher.class,this
ApplicationContext.class,this
}
registerSingleton{environment,SystemProperties,SystemProperties}
}
4. postProcessBeanFactory(beanFactory);{
beanFactory.addBeanPostProcessor(newServletContextAwareProcessor(this.servletContext, this.servletConfig));
ignoreDependencyInterface{ServletContextAware , ServletConfigAware }
beanFactory.registerScope{
request , newRequestScope()
session , newSessionScope(false)
globalSession , newSessionScope(true)
application , newServletContextScope(ServletContext sc);
}
registerResolvableDependency{
ServletRequest.class,new RequestObjectFactory()
HttpSession.class,new SessionObjectFactory()
WebRequest.class,new WebRequestObjectFactory()
}
registerSingleton{
servletContext,servletContext
cntextParameters,{contextConfigLocation=classpath*:config/spring-*.xml}
contextAttributes,tempdir..web.xml
}
}
5.invokeBeanFactoryPostProcessors(beanFactory);{
beanFactory.getBeansOfType会去获取如果存在会进行bean初始化
internalConfigurationAnnotationProcessor=ConfigurationClassPostProcessor
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry)
ConfigurationClassPostProcessor.postProcessBeanFactory(beanFactory)
这里可自定义属于自己的BeanFactoryPostProcessor
}
6.registerBeanPostProcessors(beanFactory){
以下的bean也会被初始化
获取BeanPostProcessor.class
获取两个ApplicationContextAwareProcessor,ServletContextAwareProcessor
beanFactory.addBeanPostProcessor(newBeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
处理 优先级PriorityOrdered 没优先级顺序Ordered 无序列
PriorityOrdered
AutowiredAnnotationBeanPostProcessor
instanceof MergedBeanDefinitionPostProcessor-> internalPostProcessors.add
RequiredAnnotationBeanPostProcessor internalPostProcessors.add
CommonAnnotationBeanPostProcessor internalPostProcessors.add
ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
Ordered
internalAutoProxyCreator
NoneOrdered
OrderComparator.sort(priorityOrderedPostProcessors)
beanFactory.addBeanPostProcessor
proxyTargetClass
}
7. initMessageSource();{
可自定义messageSource
new DelegatingMessageSource()
beanFactory.registerSingleton(messageSource,delegatingMessageSource)
}
8. initApplicationEventMulticaster();{
new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(applicationEventMulticaster, this.applicationEventMulticaster)
}
9. onRefresh();{
this.themeSource =ResourceBundleThemeSource
}
10. registerListeners();{
none; ApplicationListener
}
11. finishBeanFactoryInitialization(beanFactory);{
beanFactory.setTempClassLoader(null);
beanFactory.freezeConfiguration();//缓存所有bean的对象,不能被改变
beanFactory.preInstantiateSingletons();确保所有bean都被实例化了{
//实例化所有非懒加载的单例bean
//区分工厂bean和普通bean
工厂bean有SqlMapClientFactoryBean
}
}
12. finishRefresh();{
initLifecycleProcessor()->newDefaultLifecycleProcessor()
beanFactory.setLifecycleProcessor lifecycleProcessor.setBeanFacotry
lifecycleBeans暂时没用到
new ContextRefreshedEvent(this)
getApplicationEventMulticaster().multicastEvent(event);
LiveBeansView.registerApplicationContext(this);
}
调用contextInitialized
1.以自身为一个加载器initWebApplicationContext(参数为Servlet容器)
2.为this.context初始化 XmlWebApplicationContext默认,(可通过web.xml配置文件配置上下文容器的具体实例,暂时不需要)初始化过程为BeanUtils.instantiateClass(contextClass)
contextClass是通过spring自带的配置文件获取的。
3.激活this.context
可加载context的父上下文
this.context.setId("/Boxing_Plan" )
setServletContext
setConfigLocation( "classpath*:config/spring-*.xml"){
getEnvironment() ->StandardServletEnvironment resolveRequiredPlaceholders
newPropertySourcesPropertyResolver(new MutablePropertySources(this.logger))
}
getEnvironment().initPropertySources(sc,null)
customizeContext(sc,wac)
this.context.refresh() [最为重要的方法]
二、XmlWebApplicationContextXml的Web应用容器 refresh()方法
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal beanfactory.
ConfigurableListableBeanFactorybeanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
// Allows post-processing of the bean factory in contextsubclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific contextsubclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
1. prepareRefresh();
initPropertySources();{
获取容器的Environment(早在ClassLoaderListenersetConfigLocation已初始化)
WebApplicationContextUtils.initServletPropertySources
}
getEnvironment().validateRequiredProperties();{
validateRequiredProperties()
validateRequiredProperties()
}
2. beanFactory =obtainFreshBeanFactory()
refreshBeanFactory();{
beanFactory =createBeanFactory()->new DefaultListableBeanFactory(null)
setSerializationId()---org.springframework.web.context.WebApplicationContext:/BoxingPlan
setAutowireCandidateResolver-->new QualifierAnnotationAutowireCandidateResolver()
loadBeanDefinitions()[重要]{
beanDefinitionReader= new XmlBeanDefinitionReader(beanFactory);
beanDefinitionReader.setEnvironment(getEnvironment())
setResourceLoader(this)
setEntityResolver(newResourceEntityResolver(this))
}
loadBeanDefinitions(beanDefinitionReader)[重要]{
getConfigLocations()[classpath*:config/spring-*.xml]
reader.loadBeanDefinitions("classpath*:config/spring-*.xml")
//具体介绍reader 加载bean的方法
XmlBeanDefinitionReader
loadBeanDefinitions(String){
getResourceLoader()->XmlWebApplicationContext
(ResourcePatternResolver)resourceLoader.getResources("classpath:..")
(InputSource)encodedResource.getResource().getInputStream()
确认验证模式VALIDATION_DTDVALIDATION_XSD
Documentdoc = this.documentLoader.loadDocument(
documentReader= createBeanDefinitionDocumentReader()->DefaultBeanDefinitionDocumentReader
newXmlReaderContext(resource)
documentReader.registerBeanDefinitions(doc,xmlReaderContext)
........
....
}
}
}
3. prepareBeanFactory(beanFactory);{
beanFactory.setBeanClassLoader
beanFactory.setBeanExpressionResolver(newStandardBeanExpressionResolver());
beanFactory.addPropertyEditorRegistrar(newResourceEditorRegistrar(this, getEnvironment()));
beanFactory.addBeanPostProcessor(newApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface{
ResourceLoaderAware.class
ApplicationEventPublisherAware.class
MessageSourceAware.class
ApplicationContextAware.class
EnvironmentAware.class
}
beanFactory.registerResolvableDependency{
BeanFactory.class,beanFactory
ResourceLoader.class,this
ApplicationEventPublisher.class,this
ApplicationContext.class,this
}
registerSingleton{environment,SystemProperties,SystemProperties}
}
4. postProcessBeanFactory(beanFactory);{
beanFactory.addBeanPostProcessor(newServletContextAwareProcessor(this.servletContext, this.servletConfig));
ignoreDependencyInterface{ServletContextAware , ServletConfigAware }
beanFactory.registerScope{
request , newRequestScope()
session , newSessionScope(false)
globalSession , newSessionScope(true)
application , newServletContextScope(ServletContext sc);
}
registerResolvableDependency{
ServletRequest.class,new RequestObjectFactory()
HttpSession.class,new SessionObjectFactory()
WebRequest.class,new WebRequestObjectFactory()
}
registerSingleton{
servletContext,servletContext
cntextParameters,{contextConfigLocation=classpath*:config/spring-*.xml}
contextAttributes,tempdir..web.xml
}
}
5.invokeBeanFactoryPostProcessors(beanFactory);{
beanFactory.getBeansOfType会去获取如果存在会进行bean初始化
internalConfigurationAnnotationProcessor=ConfigurationClassPostProcessor
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry)
ConfigurationClassPostProcessor.postProcessBeanFactory(beanFactory)
这里可自定义属于自己的BeanFactoryPostProcessor
}
6.registerBeanPostProcessors(beanFactory){
以下的bean也会被初始化
获取BeanPostProcessor.class
获取两个ApplicationContextAwareProcessor,ServletContextAwareProcessor
beanFactory.addBeanPostProcessor(newBeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
处理 优先级PriorityOrdered 没优先级顺序Ordered 无序列
PriorityOrdered
AutowiredAnnotationBeanPostProcessor
instanceof MergedBeanDefinitionPostProcessor-> internalPostProcessors.add
RequiredAnnotationBeanPostProcessor internalPostProcessors.add
CommonAnnotationBeanPostProcessor internalPostProcessors.add
ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
Ordered
internalAutoProxyCreator
NoneOrdered
OrderComparator.sort(priorityOrderedPostProcessors)
beanFactory.addBeanPostProcessor
proxyTargetClass
}
7. initMessageSource();{
可自定义messageSource
new DelegatingMessageSource()
beanFactory.registerSingleton(messageSource,delegatingMessageSource)
}
8. initApplicationEventMulticaster();{
new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(applicationEventMulticaster, this.applicationEventMulticaster)
}
9. onRefresh();{
this.themeSource =ResourceBundleThemeSource
}
10. registerListeners();{
none; ApplicationListener
}
11. finishBeanFactoryInitialization(beanFactory);{
beanFactory.setTempClassLoader(null);
beanFactory.freezeConfiguration();//缓存所有bean的对象,不能被改变
beanFactory.preInstantiateSingletons();确保所有bean都被实例化了{
//实例化所有非懒加载的单例bean
//区分工厂bean和普通bean
工厂bean有SqlMapClientFactoryBean
}
}
12. finishRefresh();{
initLifecycleProcessor()->newDefaultLifecycleProcessor()
beanFactory.setLifecycleProcessor lifecycleProcessor.setBeanFacotry
lifecycleBeans暂时没用到
new ContextRefreshedEvent(this)
getApplicationEventMulticaster().multicastEvent(event);
LiveBeansView.registerApplicationContext(this);
}
相关文章推荐
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- OpenStack建立实例完整过程源码详细分析(12)----依据AMQP通信架构实现消息发送机制解析之一
- Java【集合系列】-12- TreeMap详细介绍(源码解析)和使用示例
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- JFinal 源码超详细解析之DB+ActiveRecord
- (干货) Android Volley框架源码详细解析
- Thrift之TProtocol类体系原理及源码详细解析之其他协议类和总结
- Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
- JUC.Lock(锁机制)学习笔记[附详细源码解析]
- Thrift之代码生成器Compiler原理及源码详细解析3
- Jdk1.6 JUC源码解析(12)-ArrayBlockingQueue
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例