Spring 标签加载bean的原理是怎样的

 我来答
安徽新华电脑专修学院
2018-03-09 · 百度知道合伙人官方认证企业
安徽新华电脑专修学院
安徽新华电脑专修学院始建于1988年,隶属于新华教育集团,是国家信息化教育示范基地、中国 IT 教育影响力品牌院校.
向TA提问
展开全部

Spring管理bean:

1.从web.xml里面配置的ContextLoaderListener开始。

2.ContextLoaderListener继承ContextLoader

3.执行ContextLoaderListener的contextInitialized方法,获得servletContext.

4.把servletContext传入ContextLoader的initWebApplicationContext(ServletContext servletContext)方法并执行。

5.通过ContextLoader.createWebApplicationContext(servletContext)获得this.context(WebApplicationContext)实例。

默认情况下这个context就是XmlWebApplicationContext。

这个XmlWebApplicationContext继承一个AbstractApplicationContext类。

再执行ContextLoader.configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc)方法,

执行AbstractApplicationContext的.refresh();方法

[java] view plain copy

  • @Override  

  • public void refresh() throws BeansException, IllegalStateException {  

  • synchronized (this.startupShutdownMonitor) {  

  • // Prepare this context for refreshing.  

  • prepareRefresh();  

  • // Tell the subclass to refresh the internal bean factory.  

  • ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  

  • // Prepare the bean factory for use in this context.  

  • prepareBeanFactory(beanFactory);  

  • try {  

  • // Allows post-processing of the bean factory in context subclasses.  

  • 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 context subclasses.  

  • onRefresh();  

  • // Check for listener beans and register them.  

  • registerListeners();  

  • // Instantiate all remaining (non-lazy-init) singletons.  

  • finishBeanFactoryInitialization(beanFactory);  

  • // Last step: publish corresponding event.  

  • finishRefresh();  

  • }  

  • catch (BeansException ex) {  

  • logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);  

  • // Destroy already created singletons to avoid dangling resources.  

  • destroyBeans();  

  • // Reset 'active' flag.  

  • cancelRefresh(ex);  

  • // Propagate exception to caller.  

  • throw ex;  

  • }  

  • }  

  • 这个方法完成了WebApplicationContext里面的beanfactory的初始化和bean载入,beanfactorypostprocessor的调用,beanpostprocessor的注册,ApplicationEvent的监听和注册,non-lazy-init的bean的初始化。
  • 换言之,已经把该准备的都准备好了,只需要有请求来获取bean,就根据情况或返回已经初始化的bean或进行bean的Instantiation 和 Initialization。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式