Spring IOC

本贴最后更新于 2196 天前,其中的信息可能已经事过境迁

    本文主要是记录在学习 Spring IOC 容器过程中的一些知识点总结!

关键词:工厂方法模式、反射机制

一、Spring

   Spring 是一个开源的、轻量级的 J2EE 开发框架,核心思想是 IOC 实现松耦合,利用 AOP 将应用的业务逻辑与系统服务分离。

二、Spring IOC

      实现原理:工厂模式 + 反射机制

**      把 IOC 容器的工作模式看做是工厂模式的升华,可以把 IOC 容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言提供的反射机制,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC 是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。**

     IOC 控制反转:就是应用本身不负责所依赖对象的创建和维护,而是由外部容器对依赖对象进行创建和维护,这种对依赖对象的控制权转移到了外部容器,称之为控制反转;(-> 也就是说一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或查找依赖对象;;可以理解 IOC 与 JNII 相反,不是对象从容器中查找依赖,而是容器在对象初始化时不等到对象请求时就主动将依赖传递给它)

  **  DI 依赖注入:与 IOC 相应地会出现一个依赖注入的概念,指在应用程序运行期间,由外部容器动态地将依赖对象注入到组件中,一般通过构造函数或 setter 传递或接口传递**

    **Spring IOC 容器原理:**就是 spring 在启动时,会读取应用程序所提供的 Bean 配置信息,并在 Spring 容器中对应生成一份 Bean 配置注册表,然后根据该注册表实例化 Bean,和装配好 Bean 之间的依赖关系;然后将 Bean 实例放到 Spring 容器的 Bean 缓存池(HashMap 实现)中,最终支撑上层应用的运行!

简言之,就是 Spring 在启动的时候,通过一个配置文件描述 Bean 和 Bean 之间的依赖关系,并生成相应的配置注册表,然后利用 java 语言的反射机制实例化 Bean 及建立 Bean 之间的依赖关系

    反射是 Java 语言的一个特性,它允许程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作

IOC 容器初始化过程

   **  定位 Resource 资源**:由 ResourceLoader 通过统一的 Resource 接口完成对 Resource 外部资源的定位,也即 BeanDefinition 的资源定位

    载入 BeanDefinition:由 BeanDefinitionReader 读取、解析定位的 Resource 资源,也即将用户定义好的 Bean 表示成 IOC 容器的内部数据结构 BeanDefinition

   注册:通过 BeanDefinitionRegistry 接口,向 IOC 容器注册上一步中载入的 BeanDefinition(其实是一个 HashMap 进行管理的),IOC 容器通过 HashMap 数据结构对 BeanDefinition 进行维护管理

   **依赖注入:**是发生在在应用第一次调用 getBean(BeanFactory 接口的方法)时向容器获取 Bean 时进行依赖注入的,若某个 Bean 设置 lazyinit 属性,则该 Bean 在容器初始化时就会被依赖注入

Spring 容器 - Spring 容器分为两类

    BeanFactory:**最常用的 BeanFactory 实现就是 XmlBeanFactory 类,它根据 XML 文件中的定义加载 beans,该容器从 XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用,**BeanFactory 是 Spring 框架的基础设施面向 Spring 本身;
    ApplicationContext 应用上下文:基于 BeanFactory 之上构建,并提供面向应用(Spring 框架的开发者)的服务

    关系:ApplicationContext 由 BeanFactory 派生,通过该类很多功能可以直接通过配置方式实现(而在 BeanFactory 中则需要以编程方式实现)

SpringIOC 容器中重要的实现类

    BeanDefinition:Spring 配置文件中每一个节点元素均对应容器中国的一个 BeanDefinition 对象,描述 Bean 的配置信息;

    BeanDefinitionRegistry:该接口提供向容器手动注册 BeanDefinition 对象的方法;

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

    HierarchicalBeanFactory:该接口提供子容器可访问父容器中 Bean的功能,也即通过该接口 SpringIOC 容器可以建立父子级联的容器体系(如 SpringMVC 中表现层 Bean 位于一个子容器中,业务层和持久层位于父容器中,因此表现层 Bean 可以引用业务层和持久层的 Bean,而业务层和持久层不能使用表现层 Bean);

    ConfigurableBeanFactory:该接口用于增强 Ioc 容器的可定制性,提供设置类装载器、属性编辑器、容器初始化后置处理器等方法;

    AutowireCapableBeanFactory:该接口定义了可将容器中 Bean 按照某种规则(如名字匹配、类型匹配)进行自动装配的方法;

    SingletonBeanRegistry:该接口提供运行期间向容器注册单例实例 Bean的方法;

三、SpringMVC - WebApplicationContext

**     WebApplicationContext 是专门为 Web 应用准备的(必须在拥有 web 容器的前提下才能完成启动工作),允许从相对于 Web 根目录的路径中装载配置文件完成初始化工作。**

     启动过程:

    web 容器如 tomcat -> web.xml(配置自启动的 Servlet 或定义 Web 容器监听器) -> Servlet 如 ContextLoaderServlet,也即在 tomcat 中创建一个 ServletContext 实例(用于启动 WebApplicationContext) -> WebApplicationContext 中引用 ServletContext 并将整个应用的 Spring 上下对象 WebApplicationContext 作为属性(以 ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为键)放在 ServletContext 中 -> 因而 web 容器可以通过 ServletContext 实例获取到 Spring 上下文对象

    Spring 中分别提供了用于启动 WebApplicationContext 的 Servlet 或 web 容器监听器:

    org.springframework.web.context.ContextLoaderServlet

    org.springframework.web.context.ContextLoaderListener   

参考:

1、SpringIOC 原理总结

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 17 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 155 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 1 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 25 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 453 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 155 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 328 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 629 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 672 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    26 引用 • 84 回帖 • 2 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 733 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 510 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 911 回帖 • 245 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 488 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 62 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖