Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
二、Spring框架组成
7个主要模块如下
Core(核心容器):核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是通过工厂模式来实现的。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
三、核心组件详解 Bean/Context/Core/IOC/AOP/MVC
Spring 框架中的核心组件只有三个:Core、Context 和 Beans,其中Beans 组件最为重要;
Spring 就是面向 Bean 的编程(BOP,Bean Oriented Programming):关键点是把对象之间的依赖关系转而用配置文件来管理,也就是依赖注入机制;
Spring 设计策略类似面向对象编程(Object Oriented Programming),Spring将对象包装在 Bean 中,进而对这些对象管理以及进行一些额外操作;
三者关系:Bean 中包装Object,Object中包含数据;Context是Bean 依赖关系的集合;Core 是发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具;
1、Bean 组件在 Spring 的 org.springframework.beans 包下:Bean 的定义、Bean 的创建以及对 Bean 的解析
(1)Bean 的定义,BeanDefinition,类图如下:
Bean 的定义就是完整的描述了在 Spring 的配置文件中定义的
(2)Bean 的创建由工厂模式实现,类图如下:
其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory;最终实现所有的接口的默认实现类是DefaultListableBeanFactory;ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。
(3)Bean 的解析,类图如下:
2、Context 组件在 Spring 的 org.springframework.context 包下:环境构建
Context 相关的类结构图如下:
ApplicationContext 是 Context 的顶级父类,他除了能标识一个应用环境的基本信息外,他还继承了扩展了 Context 功能的五个接口;
ApplicationContext 继承了 BeanFactory(再次Spring 容器中运行的主体对象是 Bean);ApplicationContext 继承了 ResourceLoader 接口用于访问到任何外部资源(Core 的功能);
ApplicationContext 的子类主要包含两个方面:
ConfigurableApplicationContext 表示该 Context 是可修改的,也就是在构建 Context 中用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 类。
WebApplicationContext 顾名思义,就是为 web 准备的 Context 他可以直接访问到 ServletContext,通常情况下,这个接口使用的少。
Context 作为 Spring 的 Ioc 容器,基本上整合了 Spring 的大部分功能,或者说是大部分功能的基础:标识一个应用环境;利用 BeanFactory 创建 Bean 对象;保存对象关系表;能够捕获各种事件;
3、Core 组件: Spring 的核心组件
Core 组件作为 Spring 的核心组件,包含了很多的关键类,重要组成部分就是定义了资源的访问方式;
Core 相关的类结构图如下:
Resource 接口继承了 InputStreamSource 接口,这个接口中有个 getInputStream 方法,返回的是 InputStream 类,所有的资源都被可以通过 InputStream 类来获取,屏蔽资源提供者;
ResourceLoader 接口实现加载资源,保持资源的加载者的统一,默认实现是 DefaultResourceLoader;
Context 和 Resource 的类关系图如下:
Context 是把资源的加载、解析和描述工作委托给了 ResourcePatternResolver 类来完成,他相当于一个接头人,他把资源的加载、解析和资源的定义整合在一起便于其他组件使用;
4、IOC — 贴入源码注释均为“英译汉”,望理解
概念Inversion of Control(控制反转):把对象之间的依赖关系转而用配置文件来管理;对组件对象的控制权转移给外部容器;对象的协作关系由容器来建立。(不再由对象自己来负责)
(1)如何创建 BeanFactory 工厂?
Ioc 容器,实际上是 Context 组件结合其他两个组件共同构建了一个 Bean 关系网,源码如下
源码片段0:ApplicationContext =new FileSystemXmlApplicationContext(xmlPath);
复制代码
1
7 //构造方法
8 public FileSystemXmlApplicationContext(String..、configLocations) throws BeansException {
9 this(configLocations, true, null);
10 }
11
12 //实际调用
13 public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
14 throws BeansException {
15 super(parent);
16 setConfigLocations(configLocations);
17 if (refresh) {
18 refresh();
19 }
20 }
复制代码
源码片段1:AbstractApplicationContext 的refresh 方法
复制代码
1 //构建的入口就在 AbstractApplicationContext 类的 refresh 方法中,方法的代码如下:
2 public void refresh() throws BeansException, IllegalStateException {
3 synchronized (this.startupShutdownMonitor) {
4 //调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识
// Prepare this context for refreshing.
5 prepareRefresh();
6 //告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从 // Tell the subclass to refresh the internal bean factory.
7 //子类的refreshBeanFactory()方法启动 --父子工厂均进行刷新
8 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
9 //为BeanFactory配置容器特性,例如类加载器、事件处理器等 // Prepare the bean factory for use in this context.
10 prepareBeanFactory(beanFactory);
11 try {
12 //为容器的某些子类指定特殊的BeanPost事件处理器
// Allows post-processing of the bean factory in context subclasses.
13 postProcessBeanFactory(beanFactory);
14 //调用所有注册的BeanFactoryPostProcessor的Bean
// Invoke factory processors registered as beans in the context.
15 invokeBeanFactoryPostProcessors(beanFactory);
16 //为BeanFactory注册BeanPost事件处理器、 // Register bean processors that intercept bean creation.
17 //BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件
18 registerBeanPostProcessors(beanFactory);
19 //初始化信息源,和国际化相关、 // Initialize message sourc