欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IOC容器

程序员文章站 2022-07-12 13:10:45
...

一、基础概念

  1. IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需在代码中new相关的对象,应用程序由IOC容器进行组装

  2. spring IOC管理的对象,我们称为bean。bean就是spring容器初始化,装配,及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别


二、工作流程

  1. 准备配置文件:在配置文件中声明Bean定义也就是为Bean配置元数据。

  2. 由IoC容器进行解析元数据: IoC容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,IoC容器根据BeanDefinition进行实例化、配置及组装Bean。

  3. 实例化IoC容器:由客户端实例化容器,获取需要的Bean


三、BeanFactory

  1. BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范

  2. BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。默认实现类是 DefaultListableBeanFactory,他实现了所有的接口

  3. 继承体系
    IOC容器

    • 1)BeanFactory:位于类结构树的顶端,它最主要的方法就是getBean(String beanName) 该方法从容器中返回指定名称的Bean

    • 2)ListableBeanFactory: 该接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数,获取某一类型Bean的配置名、查看容器中是否包含某一Bean等。

    • 3)HierarchicalBeanFatory: 父子级联IOC容器的接口,子容器可以通过接口方法访问父容器

    • 4)ConfigureableBeanFactory: 这是一个重要的接口,增强了IOC容器的可定制型。它定义了设置类装载器、熟悉编辑器、容器初始化后置处理器等方法

    • 5)AutowireCapableBeanFactory: 定义了将容器中的Bean按某种规则(如按名字匹配或类型匹配等)进行自动装配的方法

    • 6)SingletonBeanRegistry: 定义了允许在运行期向容器注册单实例Bean的方法

    • 7)BeanDefinitionRegistry: Spring配置文件中每一个节点元素在Spring容器里都通过一个BeanDefinition对象表示,它描述了Bean的配置信息,而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法。

    • 8) DefaultListableBeanFactory : 类图最底层,默认实现类


四、ApplicationContext

  1. ApplicationContext的主要实现类施ClassPathXmlApplicationContext和 FileSystemXmlApplicationContext, 前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件

  2. 继承了ListableBeanFactory和HierarchicalBeanFactory,在此基础上,还通过多个其他的接口扩展了BeanFactory的功能

  3. 继承体系

    IOC容器

    • 1)ApplicationEventPublisher: 让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。实现了ApplicationListener事件监听接口的Bean可以接收到容器事件,并对事件进行响应处理。在ApplicationContext抽象实现类AbstarctApplicationContext中存在一个ApplicationEventMulticaster,它负责保存所有的监听器,以便在容器产生上下文事件时通知这些事件监听者。

    • 2)MessageSource: 为应用提供il8n国际化消息访问的功能

    • 3)ResorucePatternResolver: 所有ApplicationContext实现类都实现了类似于PathMatchingResourcePatterResolver的功能,可以通过带前缀的Ant风格的资源文件路径装在spring的配置文件

    • 4)Lifecycle: 该接口提供了start()和stop()两个方法,主要用于控制异步处理过程。在具体使用是,该接口同时被ApplicationContext实现及具体Bean实现,ApplicationContext会将start/stop 的信息传递给容器中所有实现了该接口的Bean,以达到管理和控制JMX、任务调度等目的。

    • 5)ConfigurableApplicationContext:扩展于ApplicationContext,它新增了两个主要方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用refresh()即可启动应用上下文,在已经启动的状态下调用refresh()则可清除缓存并重新装载配置信息,而调用close()则可关闭应用上下文。


五、WebApplicationContext

  1. WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作

  2. 从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文

  3. 继承体系(相比就是多了一个ConfigureableWebApplicationContext), 多了跟ServletContext相关的东西

  4. 启动:相比前两者,它必须拥有Web容器的前提下才能完成启动。启动方法:

    1) 在web.xml中配置自启动(load-on-startup=1)的Servlet(org.springframework.web.context.ContextLoaderServlet)

    2) 在web.xml中配置监听器(org.springframework.web.context.ContextLoaderListener

参考网址

书籍:《精通Spring 4.x 企业应用开发实战》

Spring源码分析——BeanFactory体系之接口详细分析

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激