前言:
spring始终是java程序员必须要掌握的一个技能,随着springBoot的普及,springBoot替开发者实现了大量初始化工作,隐藏了实现细节,方便了我们快速开展业务,但是掌握好spring,熟悉基础,才能更好的知道应用是为什么这样运行的,出现问题怎么去解决。反反复复,我也尝试看了很多遍spring的源代码,但是都只是知识在脑海中过了一下,并没有留下、理解。这一次将之前的知识点记录下来,以供之后查阅.
认识spring容器和组件
spring容器
spring容器是什么?
spring容器指的是一个通过配置文件或类似方式加载配置的容器,这个容器必须要有创建、管理、销毁、管理Bean对象的功能。
顶级抽象接口:ApplicationContext
- ApplicationContext
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
//返回context的唯一标识
@Nullable
String getId();
//返回context的名称
String getApplicationName();
//
String getDisplayName();
//返回context的启动时间
long getStartupDate();
//返回context的parent context
@Nullable
ApplicationContext getParent();
//返回AutowireCapableBeanFactory
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
可以看到Spring抽象出来的最顶层的接口ApplicationContext只有寥寥几个方法,分别是返回名称/启动时间/父容器/自动装配工厂。在看接口的实现有哪些
spring容器的功能
-
spring容器功能

-
spring容器类型

BeanFactory和ApplicationContext的对比
| \ | BeanFactory | ApplicationContext |
|---|---|---|
| 初始化bean方式 | 在启动时,不会实例化Bean,从容器中获取的时候才会实例化bean | 启动时就会初始化全部bean,可配置lazy-init=true实现延迟加载 |
Application容器的特点和功能

BeanFactory 是 Spring 框架的基础,提供了基本的 bean 管理功能,而 ApplicationContext 是 BeanFactory 的扩展,提供了更丰富的功能,更适合于企业级应用的开发。 在实际开发中,通常推荐使用 ApplicationContext,除非有特殊的性能或资源限制。
spring组件
资源抽象接口
| 名称 | 功能 |
|---|---|
| FileSystemResource | 文件系统绝对路径的方式进行访问 |
| ClassPathResource | 以类路径的方式进行访问 |
| ServletContextResource | 相对于Web应用根目录的方式进行访问 |
BeanFactory组件类
-
DefaultListableBeanFactory类图

-
观察BeanFactory的类图结构为:

-
BeanFactory中定义的功能

BeanFactory下有三个实现类,分别是:
- ListableBeanFactory
- HierarchicalBeanFactory
- AutowireCapableBeanFactory
ListableBeanFactory
-
定义:可将Bean列出的工厂类
-
主要的功能有:
| 方法名称 | 功能含义 |
|---|---|
| boolean containsBeanDefinition(String beanName) | 根据名称判断是否有BeanDefinition |
| int getBeanDefinitionCount() | 返回BeanDefinition的个数 |
| String[] getBeanDefinitionNames() | 返回BeanDefinition的名称集合 |
| String[] getBeanNamesForType(Class<?> type) | 根据类型返回Bean的名称集合 |
| Map<String,T> getBeansOfType(Class |
根据类型返回Bean实例 |
HierarchicalBeanFactory
-
定义:实现Bean工厂的分层
-
主要的功能有:
| 方法名称 | 功能含义 |
|---|---|
| BeanFactory getParentBeanFactory() | 返回bean工厂的父工厂 |
| boolean containsLocalBean(String name) | 根据名称判断该Bean工厂是否包含这个bean |
AutowireCapableBeanFactory
-
定义:实现自动装配的Bean工厂
-
主要的功能有:
| 方法名称 | 功能含义 |
|---|---|
| applyBeanPostProcessorsBeforeInitialization、applyBeanPostProcessorsBeforeInitialization、applyBeanPropertyValues | 分别是执行InstantiationAwareBeanPostProcessor接口对应的方法 |
| configureBean | 给Bean自动装配属性 |
| createBean、destroyBean | 分别是创建和销毁bean |
| initializeBean | 初始化bean |
| resolveBeanByName | 分解指定依赖的方法 |
- AutowireCapableBeanFactory方法

ConfigurableBeanFactory
ConfigurableBeanFactory是可配置的bean工厂,实现了HierarchicalBeanFactory、SingletonBeanRegistry
- SingletonBeanRegistry
注册单列bean的接口
| 方法名称 | 功能含义 |
|---|---|
| containsSingleton | 根据名称判断Bean是否存在 |
| getSingleton | 根据名称返回Bean |
| getSingletonCount | 返回Bean的个数 |
| getSingletonMutex | 返回实例化过程中的锁 |
| getSingletonNames | 返回所有bean的名称 |
| registerSingleton | 注册单列bean |
由于ConfigurableBeanFactory方法实在是太多了,因此这里只单独列举几个比较典型的方法,后面的章节在结合流程来分析。
- ConfigurableBeanFactory的方法
| 方法名称 | 功能含义 |
|---|---|
| isFactoryBean | 判断是否是BeanFactory |
| register* | 注册Bean相关的方法 |
| addBeanPostProcessor | 添加BeanPostProcessor |
ConfigurableListableBeanFactory
ConfigurableListableBeanFactory该类继承自ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactory等类
| 方法名称 | 功能含义 |
|---|---|
| registerResolvableDependency | 注册一个可分解的依赖 |
| preInstantiateSingletons | 实例化非延迟加载的bean |
| getBeanDefinition | 根据名称返回BeanDefinition |
BeanDefinitionRegistry
BeanDefinitionRegistry用来操作BeanDefinition的类,继承了AliasRegistry
AliasRegistry定义了根据别名对类进行操作的方法,包括registerAlias、removeAlias、isAlias、getAliases
- BeanDefinitionRegistry方法的定义
| 方法名称 | 功能含义 |
|---|---|
| registerBeanDefinition | 注册一个beanName名称的BeanDefinition |
| remove、get、contains | 移除、获取、判断BeanDefinition |
| getBeanDefinitionNames | 返回容器内BeanDefinition的名称数组 |
| getBeanDefinitionCount | 返回BeanDefintion的个数 |
| isBeanNameInUse | 根据名称判断BeanDefintion是否被注册过 |
ApplicationContext组件类
ApplicationContext容器以AbstractXmlApplicationContext来进行分析
- AbstractXmlApplicationContext类图

从类图可以看得出ApplicationContxt主要还是实现BeanFactory的子类,并且也继承了实现Spring容器其他特性的功能,例如事件监听、资源文件、国际化等接口
以下截取☞Learn Spring - Spring IoC的总结
-
ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。实现了ApplicationListener事件监听接口的Bean 可以接收到容器事件,并对事件进行响应处理。在ApplicationContext抽象实现类AbstractApplicationContext中,我们可以发现存在一个ApplicationEventMulticaster,它负责保存所有监听器,以便在容器产生上下文事件时通知这些事件监听者。
-
MessageSource:为应用提供i18n国际化消息访问的功能;
-
ResourcePatternResolver:所有ApplicationContext实现类都实现了类似于PathMatchingResourcePatternResolver的功能,可以通过带前缀的Ant风格的资源文件路径装载Spring的配置文件。
-
LifeCycle:该接口是Spring 2.0加入的,该接口提供了start()和stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被ApplicationContext实现及具体Bean实现,ApplicationContext会将start/stop的信息传递给容器中所有实现了该接口的Bean,以达到管理和控制JMX、任务调度等目的。
-
ConfigurableApplicationContext扩展于ApplicationContext,它新增加了两个主要的方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用refresh()即可启动应用上下文,在已经启动的状态下,调用refresh()则清除缓存并重新装载配置信息,而调用close()则可关闭应用上下文。
WebApplicantContext组件类
WebApplicationContext是一个专门为Web应用准备的,它允许从Web根目录根据相对路径进行装载配置文件完成初始化。从WebApplicationContext中可以获取ServletContext引用,整个Web应用上下文对象将作为属性放置在ServletContext中,以便Web应用环境可以访问spring上下文。
总结
主要介绍了Spring容器和组件,Spring组件主要是分为BeanFactory组件和ApplicationContext组件。这两个组件下面有分别派生出其他的组件例如BeanFactory下又有AutowireCapableBeanFactory实现了自动装配和应用InstantiationAwareBeanPostProcessor接口的方法、ConfigurableBeanFactory可配置化的BeanFactory增强了BeanFactory的能力;Application下的ApplicationEventPublisher让容器拥有发布应用上下文事件的功能(启动和关闭)、ConfigurableApplicationContext扩展于ApplicationContext,它新增加了两个主要的方法:**refresh()**和close(),让ApplicationContext具有启动、刷新和关闭应用上下文的能力。
参考资料