| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 495730f commit 85517ab
17 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -28,7 +28,7 @@ ApplicationContext bf = new ClassPathXmlApplicationContext("applicationContext.x | |||
| 28 | 28 | ### DefaultListableBeanFactory | |
| 29 | 29 | DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现。下面看看DefaultListableBeanFactory的层次结构图。 | |
| 30 | 30 | ||
| 31 | -  | ||
| 31 | +  | ||
| 32 | 32 | 从上往下开始介绍各个类以及接口的作用: | |
| 33 | 33 | - AliasRegistry(接口):alias指的是bean的别名,而aliasRegistry定义了对alias的增删改查等操作。 | |
| 34 | 34 | - SimpleAliasRegistry(类):主要使用map作为alias的缓存,并对接口AliasRegistry进行实现。 | |
@@ -48,7 +48,7 @@ DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册 | |||
| 48 | 48 | ||
| 49 | 49 | ### XmlBeanDefinitionReader | |
| 50 | 50 | XML配置文件的读取是Spring中最重要的功能,因为Spring的大部分功能都是以配置作为切入点的,XmlBeanDefinitionReader实现了对资源文件的读取、解析以及注册。先看一下XmlBeanDefinitionReader的层次结构图。 | |
| 51 | -  | ||
| 51 | +  | ||
| 52 | 52 | ||
| 53 | 53 | - EnvironmentCapable(接口):定义获取Environment方法,Environment代表了配置文件。 | |
| 54 | 54 | - BeanDefinitionReader(接口):主要定义资源文件读取并转换为BeanDefinition的各个功能。 | |
@@ -96,7 +96,7 @@ Person{name='Bruis', age=23} | |||
| 96 | 96 | ||
| 97 | 97 | ** 前方高能 ** | |
| 98 | 98 | ||
| 99 | -  | ||
| 99 | +  | ||
| 100 | 100 | ||
| 101 | 101 | 通过在断点debug,跟踪程序运行。 | |
| 102 | 102 | ||
@@ -146,7 +146,7 @@ public void setConfigLocations(String... locations) { | |||
| 146 | 146 | ||
| 147 | 147 | 下面我们来重点看看refresh()过程。 | |
| 148 | 148 | ||
| 149 | -  | ||
| 149 | +  | ||
| 150 | 150 | ||
| 151 | 151 | 1. AbstractApplicationContext.class | |
| 152 | 152 | ```Java | |
@@ -239,8 +239,8 @@ protected final void refreshBeanFactory() throws BeansException { | |||
| 239 | 239 | } | |
| 240 | 240 | ``` | |
| 241 | 241 | 这里先看看上面代码的loadBeanDefinitions()方法运行完后的结果 | |
| 242 | -  | ||
| 243 | -  | ||
| 242 | +  | ||
| 243 | +  | ||
| 244 | 244 | 从图中可以知道,loadBeanDefinitions()方法运行完后,在beanFactory变量里面存放着一个ConcurrentHashMap变量,用于存放着person这个KV键值对,Key为person,Value为一个ArrayList的变量,里面存放着person的两个属性:age、name。 | |
| 245 | 245 | ||
| 246 | 246 | 那么,person的属性是怎么被封装到beanFactory里面的呢?请看下面的源码解析。 | |
@@ -409,7 +409,7 @@ protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) | |||
| 409 | 409 | ||
| 410 | 410 | 下面,继续深入registerBeanDefinitions方法。 | |
| 411 | 411 | ||
| 412 | -  | ||
| 412 | +  | ||
| 413 | 413 | ||
| 414 | 414 | 1. XmlBeanDefinitionReader.class | |
| 415 | 415 | ```Java | |
@@ -636,8 +636,8 @@ public void parsePropertyElement(Element ele, BeanDefinition bd) { | |||
| 636 | 636 | } | |
| 637 | 637 | ||
| 638 | 638 | ``` | |
| 639 | -  | ||
| 640 | -  | ||
| 639 | +  | ||
| 640 | +  | ||
| 641 | 641 | ||
| 642 | 642 | 然后,就会一路返回到refresh()方法里的加载bean定义信息的方法——loadBeanDefinitions(),此时beanFactory里面就会存在一个带有KV对的ConcurrentHashMap,而这个beanFactory会存放在Spring容器里面。 | |
| 643 | 643 | ```Java | |
@@ -648,8 +648,8 @@ customizeBeanFactory(beanFactory); | |||
| 648 | 648 | loadBeanDefinitions(beanFactory); | |
| 649 | 649 | ``` | |
| 650 | 650 | 再看看DefaultListableBeanFactory里面的内容 | |
| 651 | -  | ||
| 652 | -  | ||
| 651 | +  | ||
| 652 | +  | ||
| 653 | 653 | ||
| 654 | 654 | 上面的过程,就已经完成了Spring容器的初始化过程,相信读者也已经对Spring容器的初始化有了一个大致的了解。下面总结一下Spring容器的初始化: | |
| 655 | 655 | - 第一个过程是Resource定位过程。这个Resource定位过程指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一接口。这个定位过程类似于容器寻找数据的过程,就像使用水桶装水先要把水找到一样。 | |
@@ -670,7 +670,7 @@ bean的创建和初始化过程是在refresh方法里的invokeBeanFactoryPostPro | |||
| 670 | 670 | - 当容器关闭时,调用Bean的销毁方法 | |
| 671 | 671 | ||
| 672 | 672 | 下面先看看创建bean和初始化bean的时序图。 | |
| 673 | -  | ||
| 673 | +  | ||
| 674 | 674 | ||
| 675 | 675 | 1. AbstractApplicationContext.class | |
| 676 | 676 | ```Java | |
@@ -967,7 +967,7 @@ public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { | |||
| 967 | 967 | ``` | |
| 968 | 968 | ||
| 969 | 969 | 无图无真相: | |
| 970 | -  | ||
| 970 | +  | ||
| 971 | 971 | ||
| 972 | 972 | 5. AbstractAutowireCapableBeanFactory.class | |
| 973 | 973 | ```Java | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -79,7 +79,7 @@ SpringIOC容器是如何在Web环境中被加载并起作用的?SpringIOC容 | |||
| 79 | 79 | IOC容器的启动过程就是建立Spring上下文的过程,该上下文是与ServletContext相伴而生的,同时也是IOC容器在Web应用环境中的具体表现之一。由ContextLoaderListener启动的上下文为根上下文。在根上下文的基础上,还有一个与Web MVC相关的上下文应用来保存控制器(DispatcherServlet)需要的MVC对象,**作为根上下文的子上下文**,构成一个层次化的上下文体系,这个与Web MVC相关的上下文——WebApplicationContext。在Web容器中启动Spring应用程序时,首先建立根上下文,然后建立这个上下文体系,这个上下文体系的建立是由ContextLoader来完成的。简单点说,ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。 | |
| 80 | 80 | ||
| 81 | 81 | 先看看Web程序启动到SpringIOC容器创建和初始化的整个过程。 | |
| 82 | -  | ||
| 82 | +  | ||
| 83 | 83 | ||
| 84 | 84 | 结合着时序图,再去调试源码,思路会清晰很多。 | |
| 85 | 85 | ||
@@ -272,7 +272,7 @@ protected Class<?> determineContextClass(ServletContext servletContext) { | |||
| 272 | 272 | ``` | |
| 273 | 273 | ||
| 274 | 274 | 下面看看默认的IOC容器是什么。有图有真相: | |
| 275 | -  | ||
| 275 | +  | ||
| 276 | 276 | ||
| 277 | 277 | ```Java | |
| 278 | 278 | protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments