spring源代码学习(一) 认识spring容器和组件


前言:
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容器功能

  • spring容器类型
    spring容器类型

BeanFactory和ApplicationContext的对比

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

Application容器的特点和功能

Application类别和特点

BeanFactory 是 Spring 框架的基础,提供了基本的 bean 管理功能,而 ApplicationContext 是 BeanFactory 的扩展,提供了更丰富的功能,更适合于企业级应用的开发。 在实际开发中,通常推荐使用 ApplicationContext,除非有特殊的性能或资源限制。

spring组件

资源抽象接口

名称 功能
FileSystemResource 文件系统绝对路径的方式进行访问
ClassPathResource 以类路径的方式进行访问
ServletContextResource 相对于Web应用根目录的方式进行访问

BeanFactory组件类

  • DefaultListableBeanFactory类图
    DefaultListableBeanFactory类图

  • 观察BeanFactory的类图结构为:
    BeanFactory的类图

  • 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 type) 根据类型返回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方法
    AutowireCapableBeanFactory

ConfigurableBeanFactory

ConfigurableBeanFactory是可配置的bean工厂,实现了HierarchicalBeanFactorySingletonBeanRegistry

  • SingletonBeanRegistry
    注册单列bean的接口
方法名称 功能含义
containsSingleton 根据名称判断Bean是否存在
getSingleton 根据名称返回Bean
getSingletonCount 返回Bean的个数
getSingletonMutex 返回实例化过程中的锁
getSingletonNames 返回所有bean的名称
registerSingleton 注册单列bean

由于ConfigurableBeanFactory方法实在是太多了,因此这里只单独列举几个比较典型的方法,后面的章节在结合流程来分析。

  • ConfigurableBeanFactory的方法
方法名称 功能含义
isFactoryBean 判断是否是BeanFactory
register* 注册Bean相关的方法
addBeanPostProcessor 添加BeanPostProcessor

ConfigurableListableBeanFactory

ConfigurableListableBeanFactory该类继承自ListableBeanFactoryAutowireCapableBeanFactoryConfigurableBeanFactory等类

方法名称 功能含义
registerResolvableDependency 注册一个可分解的依赖
preInstantiateSingletons 实例化非延迟加载的bean
getBeanDefinition 根据名称返回BeanDefinition

BeanDefinitionRegistry

BeanDefinitionRegistry用来操作BeanDefinition的类,继承了AliasRegistry

AliasRegistry定义了根据别名对类进行操作的方法,包括registerAliasremoveAliasisAliasgetAliases

  • BeanDefinitionRegistry方法的定义
方法名称 功能含义
registerBeanDefinition 注册一个beanName名称的BeanDefinition
remove、get、contains 移除、获取、判断BeanDefinition
getBeanDefinitionNames 返回容器内BeanDefinition的名称数组
getBeanDefinitionCount 返回BeanDefintion的个数
isBeanNameInUse 根据名称判断BeanDefintion是否被注册过

ApplicationContext组件类

ApplicationContext容器以AbstractXmlApplicationContext来进行分析

  • AbstractXmlApplicationContext类图

3ohgJO.png
从类图可以看得出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具有启动、刷新和关闭应用上下文的能力。

参考资料


  TOC