Spring IOC

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

    本文主要是记录在学习 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 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 163 关注

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 2 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 638 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 21 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    534 引用 • 671 回帖
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • NGINX

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

    311 引用 • 546 回帖 • 56 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 32 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 321 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    16 引用 • 68 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    139 引用 • 441 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 591 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 285 关注
  • 招聘

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

    189 引用 • 1056 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 3 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 506 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 429 关注
  • CodeMirror
    1 引用 • 2 回帖 • 109 关注