Spring原理-IOC控制反转

article/2025/11/6 20:11:23

spring相关文章

Spring原理-IOC控制反转
Spring框架七大核心模块
Spring Beans原理–bean生命周期

一、Spring概述

1、 定义

  • Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发复杂性。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发
  • Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发
  • Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)和面向切面编程(aspectoriented programming,AOP)

二、IOC(控制反转)

1、Spring IOC 容器

  • 控制反转即IOC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器
  • Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

2、作用

  1. 管理对象的创建和依赖关系的维护
  2. 解耦,由容器去维护具体的对象
  3. 托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分处理交给容器,应用程序则无需去关心类是如何完成代理的

3、 BeanFactory 和 ApplicationContext

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中
ApplicationContext是BeanFactory的子接口

1. 依赖关系

  1. BeanFactory
    是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系
  2. ApplicationContext
    作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能
    • 继承MessageSource,因此支持国际化
    • 统一的资源文件访问方式
    • 提供在监听器中注册bean的事件
    • 同时加载多个配置文件
    • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
  3. 关系UML图
    在这里插入图片描述
  • 最上面的是 BeanFactory,下面的 3 个绿色的,都是功能扩展接口
  • 看下面的隶属 ApplicationContext 粉红色的 “高级容器”,依赖着 “低级容器”,他依赖着 “低级容器” 的 getBean 功能。而高级容器有更多的功能:支持不同的信息源头,可以访问文件资源,支持应用事件(Observer 模式)
  • 左边灰色区域的是 “低级容器”, 只负载加载 Bean,获取 Bean。容器其他的高级功能是没有的。例如上图画的 refresh 刷新 Bean 工厂所有配置,生命周期事件回调等

2、加载方式

  • BeanFactroy
    采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常
  • 流程
    • 加载配置文件,解析成 BeanDefinition 放在 Map 里
    • 调用 getBean 的时候,从 BeanDefinition 所属的 Map 里,拿出 Class 对象进行实例化,同时如果有依赖关系,将递归调用 getBean 方法 —— 完成依赖注入。
  • ApplicationContext
    它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
  • 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢

3、创建方式

  • BeanFactory通常以编程的方式被创建,
  • ApplicationContext还能以声明的方式创建,如使用ContextLoader

4、注册方式

BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用

  • BeanFactory需要手动注册
  • ApplicationContext则是自动注册

5、ApplicationContext的实现

  1. FileSystemXmlApplicationContext
    此容器从一个XML文件中加载beans的定义,XML Bean配置文件的全路径名必须提供给它的构造函数
  2. ClassPathXmlApplicationContext
    此容器也从一个XML文件中加载beans的定义,需要正确设置classpath因为这个容器将在classpath里找bean配置
  3. WebXmlApplicationContext
    此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean

4、依赖注入(Dependency Injection)

1. 定义

  • 系统组件之间的依赖关系由容器在应用系统运行期来决定,由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件不做查找资源或者其他依赖的协作对象,只提供普通的Java方法让容器去决定依赖关系,
  • 配置对象的工作应该由IOC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IOC容器负责
  • 容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造器传递给需要的对象

2. 优势

  • 让容器全权负责依赖查询,受管组件只需要暴露JavaBean的setter方法或者带参数的构造器或者接口,使容器可以在初始化时组装对象的依赖关系
  • 查找定位操作与应用代码完全无关
  • 不依赖于容器的API,可以很容易地在任何容器以外使用应用对象
  • 不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器

3. 依赖注入实现方式

3.2 实现方式
  1. 接口注入 (Interface Injection)
    接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃
  2. Setter方法注入(Setter Injection)
    构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖
  3. 构造器注入(Constructor Injection)
    Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入
3.2 区别
构造函数注入setter 注入
没有部分注入有部分注入
不会覆盖 setter 属性会覆盖 setter 属性
任意修改都会创建一个新实例任意修改不会创建一个新实例
适用于设置很多属性适用于设置少量属性

最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖

spring相关文章

Spring原理-IOC控制反转
Spring框架七大核心模块
Spring Beans原理–bean生命周期


http://chatgpt.dhexx.cn/article/3S4s6wwh.shtml

相关文章

依赖倒置和控制反转

依赖倒置 定义 依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦形式,使得高层次的类不依赖于低层次的类的实现细节,依赖关系被颠倒(反转),从而使得低层次类依…

Inversion of Control (IOC)控制反转 有什么好处

要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle )。 什么是依赖倒置原则?假设我们设计一辆汽车:先设计轮子,然后根据…

Spring学习:IOC控制反转

一、Spring概述: Spring是一个开源框架,其存在的根本使命就是简化JAVA开发。为了降低JAVA开发的复杂性,Spring采取了以下四种关键策略: 基于POJO的最轻量级和最小侵入性编程;通过依赖注入和面向接口实现松耦合&#x…

控制反转(IOC)简介

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。 1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程…

IoC 控制反转理解

控制反转——Inversion of Control,缩写为IoC ,是一个重要的面向对象编程的法则,说到底它是一种设计思想,其可以降低程序中的耦合度,在以前,我们通过new进行创建对象,这是程序主动去创建依赖对象…

IOC控制反转理解

1. IOC基础 IOC:全称Inversion Of Control,中文翻译是控制反转的意思。初学Spring绕不过去的一个弯,需要好好理解IOC的思想。网上看了很多博客,也看了很多网课,但是还是云里云雾。终于看到一个容易理解的例子&#xf…

C# IoC控制反转学习笔记

一、什么是IOC IoC-Invertion of Control,即控制反转,是一种程序设计思想。 先初步了解几个概念: 依赖(Dependency):就是有联系,表示一个类依赖于另一个类。 依赖倒置原则(DIP&a…

spring -- 控制反转IOC

1.IOC的理论背景 在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统地业务逻辑。 图1 软件系统中耦合的对象 齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间…

Java:控制反转

Java中自带的函数或对象都是编写软件的时候写的,当它需要调用你自己编写的数据的时候,它如何又不知道你定义的类(对象)是什么,里面有什么成员,它无法调用你的代码,这个时候就需要用到控制反转了…

IoC控制反转

IoC控制反转 一、IoC概念和原理1. 什么是IoC2. IoC底层原理 二、IoC过程1. xml配置文件,配置创建的对象2. 有UserService和UserDao类,创建工厂类 三、IoC接口1. IoC思想基于IoC容器完成,IoC容器底层就是Bean工厂2. Spring提供实现IoC容器的两…

IOC 控制反转

文章目录 一.IOC概念二. IOC的体现三.ioc的技术实现三.基于XML的DI1.引用类型属性自动注入 四.包含关系的配置文件五.基于注解的DI五.简单类型的属性赋值1.vaule(简单类型的属性赋值)2.自动注入 一.IOC概念 IOC:控制反转,是一个理论&#xf…

浅谈控制反转(IoC)

Inversion of Control 什么是控制反转? 程序的流程控制权相对于传统的面向过程编程而言发生了反转。下面是维基百科的描述 In software engineering, inversion of control (IoC) is a programming principle. IoC inverts the flow of control as compared to tr…

Spring---浅谈IOC

概念 IOC(Inversion of Control 控制反转)是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。 传统开发模式与IOC开发模式的对比 传统开发模式:对…

控制反转-Inversion Of Control

一、控制反转 控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专业术语。它包括依赖注入(Dependency Injection,简称DI&#xff…

微信小程序hamburgers汉堡包css动画

微信小程序hamburgers汉堡包css动画 源码在我的csdn里下载 https://download.csdn.net/download/ozhy111/12201373

汉堡式折叠html,美味的CSS动画汉堡包:hamburgers_html/css_WEB-ITnose

s if you insist, but they’re not accessible as a menu button. Append the class name of the type of hamburger you’re craving: Here’s the list of hamburger-type classes you can choose from: hamburger--arrowhamburger--arrow-rhamburger--arrowalthamburger--a…

LSB 题解

今天来刷一道Misc的题目,LSB原理进行图片隐写 LSB原理 LSB是一种利用人类视觉的局限性设计的幻术 PNG和BMP图片中的图像像素一般是由RGB(RED红 GREEN绿 BLUE蓝)三原色组成 记住,JPG图片是不适合使用LSB隐写的,JPG图片对像数进行了有损压缩…

LSB利器-zsteg

一、Usage # zsteg -h Usage: zsteg [options] filename.png [param_string] -c, --channels X channels (R/G/B/A) or any combination, comma separated valid values: r,g,b,a,rg,bgr,rgba,r3g2b3,... -l, --limi…

【linux】lsb_release -a命令

查看linux发行版本:lsb_release -a 运行该命令时若提示lsb_release命令不存在 不存在,则表明系统未安装该命令,报错如下: 解决方法: 查看 lsb_release 命令属于哪个软件包,命令为yum provides */lsb_rel…

图片LSB隐写(java)

一、隐写原理 LSB隐写原理就是图片中的像素一般是由三种颜色组成,即三原色(红绿蓝)。由这三种原色可以组成其他各种颜色,在png图片的存储中,每个颜色占有8bit,即有256种颜色,一共包含256的三次方颜色,即16777216中颜色。人类的眼睛…