博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring源码解析bean初始化后的实现和其他入口
阅读量:6185 次
发布时间:2019-06-21

本文共 4562 字,大约阅读时间需要 15 分钟。

hot3.png

前言

本文转自“天河聊技术”微信公众号

本次主要介绍bean初始化、依赖注入后续的实现和其他入口

 

正文

找到这个方法

org.springframework.context.support.AbstractApplicationContext#refresh

这一行

finishRefresh();

进入

org.springframework.context.support.AbstractApplicationContext#finishRefresh

protected void finishRefresh() {   // Clear context-level resource caches (such as ASM metadata from scanning).清除上下文级别的资源缓存(例如扫描的ASM元数据)。   clearResourceCaches();   // Initialize lifecycle processor for this context.为这个上下文初始化生命周期处理器。   initLifecycleProcessor();   // Propagate refresh to lifecycle processor first.首先传播刷新到生命周期处理器。   getLifecycleProcessor().onRefresh();   // Publish the final event.发布最后的事件。   publishEvent(new ContextRefreshedEvent(this));   // Participate in LiveBeansView MBean, if active.   LiveBeansView.registerApplicationContext(this);}

这一行

initLifecycleProcessor();

初始化生命周期处理器

进入

org.springframework.context.support.AbstractApplicationContext#initLifecycleProcessor初始化LifecycleProcessor。如果上下文没有定义,则使用DefaultLifecycleProcessor

protected void initLifecycleProcessor() {   ConfigurableListableBeanFactory beanFactory = getBeanFactory();   if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {      this.lifecycleProcessor =            beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);      if (logger.isDebugEnabled()) {         logger.debug("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");      }   }   else {      DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();      defaultProcessor.setBeanFactory(beanFactory);      this.lifecycleProcessor = defaultProcessor;      beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);      if (logger.isDebugEnabled()) {         logger.debug("Unable to locate LifecycleProcessor with name '" +               LIFECYCLE_PROCESSOR_BEAN_NAME +               "': using default [" + this.lifecycleProcessor + "]");      }   }}

回到这个方法

org.springframework.context.support.AbstractApplicationContext#refresh

这一行

catch (BeansException ex) {   if (logger.isWarnEnabled()) {      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;}

异常处理

返回

org.springframework.web.context.ContextLoader#initWebApplicationContext这一行

//        把spring上下文放在servlet上下文上         servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

返回

@Overridepublic void contextInitialized(ServletContextEvent event) {   initWebApplicationContext(event.getServletContext());}

 

我跟踪的顺序是跟着servlet容器启动这个入口看来跟踪的,还有两个入口给大家介绍下

ClassPathXmlApplicationContext

这个方法

org.springframework.context.support.ClassPathXmlApplicationContext#ClassPathXmlApplicationContext(java.lang.String)

public ClassPathXmlApplicationContext(String configLocation) throws BeansException {   this(new String[] {configLocation}, true, null);}

参数是传入一个bean定义配置文件

进入org.springframework.context.support.ClassPathXmlApplicationContext#ClassPathXmlApplicationContext(java.lang.String[], boolean, org.springframework.context.ApplicationContext)这个方法

public ClassPathXmlApplicationContext(      String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)      throws BeansException {   super(parent);   setConfigLocations(configLocations);   if (refresh) {      refresh();   }}

进入org.springframework.context.support.AbstractApplicationContext#refresh这个方法,剩下的以往的文章中都介绍过了

 

FileSystemXmlApplicationContext

找到org.springframework.context.support.FileSystemXmlApplicationContext#FileSystemXmlApplicationContext(java.lang.String)这个方法

public FileSystemXmlApplicationContext(String configLocation) throws BeansException {   this(new String[] {configLocation}, true, null);}

参数也是传入一个bean定义配置文件

进入

org.springframework.context.support.FileSystemXmlApplicationContext#FileSystemXmlApplicationContext(java.lang.String[], boolean, org.springframework.context.ApplicationContext)

public FileSystemXmlApplicationContext(      String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)      throws BeansException {   super(parent);   setConfigLocations(configLocations);   if (refresh) {      refresh();   }}

进入org.springframework.context.support.AbstractApplicationContext#refresh这个方法,剩下的以往的文章都介绍过了,applicationContext的生涯新实现就解析完了

 

最后

 

本次介绍到这里,以上内容仅供参考。

转载于:https://my.oschina.net/u/3775437/blog/1813311

你可能感兴趣的文章
eclipse导入的工程莫名报错误
查看>>
OpenGL编程轻松入门(一)
查看>>
“他们开的薪水太高了,他直接放弃了一切”
查看>>
Wince和Windows Mobile下native C++的单元测试
查看>>
判断VideoDisplay组件当前的播放状态。播放|缓冲。
查看>>
.net开发笔记(十八) winform中的等待框
查看>>
《Linux内核设计与实现》读书笔记(十八)- 内核调试
查看>>
ExtJS Form扩展组件[ColorFiled, DateTimeFiled, IconCombo, MultiComboBox, DynamicTreeCombox]
查看>>
用Supermemo背单词达到8000词条
查看>>
HTML5 Canvas 六角光阑动态效果
查看>>
Navicat Premium 连接 Oracle 数据库
查看>>
java多线程(同步与死锁问题,生产者与消费者问题)
查看>>
sql 指令
查看>>
Sql Server的JDBC测试程序与远程连接
查看>>
4.4. Datetime
查看>>
Converting ArrayList to Array / Array to ArrayList C# (原创翻译)
查看>>
微信自定义回复
查看>>
技术干货收集
查看>>
CQRS
查看>>
坚持学习WF(5):自定义活动(CustomActivity)
查看>>