您的位置:首页 > 其它

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: