Spring IOC 学习三 之 ApplicationContext容器面纱

第一篇:Spring IOC学习一

第二篇:Spring IOC学习二 之资源加载


有第一篇已经知道整个Spring IOC的最核心体系就是 ApplicationContext 本文就对这个体系进行学习一下。第一篇就说了ApplicationContext是Spring真正的高级容器。它比BeanFactory高级在哪里?

1、继承了MessageSource 提供了国际化标准访问策略

2、继承了ApplicationEventPublisher 提供了强大的事件机制

3、扩展了ResourceLoader接口,使其能批量加载资源配置

4、支持web应用

 

5776499-2062beac6c1042de.png

重新补一下图

由上图就可以明了的看到整个ApplicationContext 的大致体系结构

ApplicationContext 的两个直接子类:

1、WebApplicationContext

5776499-8279ae6f112570c1.png

该 接口的唯一方法就是为了给servlet 提供上下文接口

2、ConfigurableApplicationContext

5776499-0e66ed7491ed3545.png

以上是主要的方法

ConfigurableApplicationContext 不仅仅继承了ApplicationContext 同时还有 Lifecycle和 Closeable。这两个接口的作用是什么?

1、Lifecycle 包含了是三个方法:stop,start ,isRunning 这是Spring 容器提供的对生命周期的管理,

2、Closeable 进去看就会发现就一个方法,close 这是JDK提供的一个接口,用于关闭组件释放资源用的。


WebApplicationContext 和 ConfigurableApplicationContext 从接口接口上就会发现他们有共同的子类ConfigurableWebApplicationContext,该类是上面两个的整合,以及扩展了其他方法,


ClassPathXmlApplicationContext 是我们最常见的Spring IOC容器。这个类是整个IOC容器的最终实现类之一,它包含了1个方法和多个构造方法,除了一个无参的构造方法外,一个ApplicationContext 参数的构造方法外,其余所有的有参构造法最终都会执行一下2个方法的一种

5776499-d9370de0ad82f90c.png

第一种

5776499-113dafcb32b234e7.png

第二种

第一种是手动控制是否刷新容器,第二种是每次都刷新

第一种是根据资源位置数组 最终在父类AbstractRefreshableConfigApplicationContext中实现bean资源的定位,第二种是跟自己资源位置相对或绝对路径数组,基于给定资源加载资源的类 实例化ClassPathResource对象。

首先 super(parent) 最终是调用父类的构造方法,为容器设置好Bean资源的加载器,如下代码

5776499-60be84af25119dc1.png

5776499-ad2925d4cbe474f7.png

PathMatchingResourcePatternResolver是创建可批量加载资源的超级接口

setConfigLocations 方法,有单字符串形式和数组形式两种。ClassPathXMLApplicationContext是后者,FileSystemXMLApplicationContext是用的第一种

5776499-f9d5ad84d6453995.png

接下来就是refresh()方法,该方法最终也是要再父类中实现下面就是整个方法的说明

5776499-9681981e420950cc.png

5776499-db25e1524fc7540b.png

5776499-64168ed934cecec5.png


5776499-a5fc6b52de9d9fd8.png

主要实现是 refreshBeanFactory()和返回容器实例

5776499-51eb4543587393b8.png

refreshBeanFactory 和getBeanFactory都是抽象方法,都是在子类AbstractRefreshableApplicationContext中进行实现的,如下图:

5776499-39a02f9af5e276ed.png

loadBeanDefinitions()具体实现也是在子类AbstractXmlApplicationContext 实现的。接下来就要进入BeanDefinition体系了

refresh()方法的作用是:在创建IoC容器前,如果已经有容器存在,则需要把已有的容器销毁和关闭,以保证在refresh之后使用的是新建立起来的IoC容器。refresh的作用类似于对IoC容器的重启,在新建立好的容器中对容器进行初始化,对Bean定义资源进行载入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值