Spring学习:IOC控制反转

article/2025/11/6 21:53:03

一、Spring概述:

        Spring是一个开源框架,其存在的根本使命就是简化JAVA开发。为了降低JAVA开发的复杂性,Spring采取了以下四种关键策略:

  • 基于POJO的最轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程
  • 通过切面和模板减少样板式代码。

1.1 Spring有两个核心部分:IOC和AOP:

    (1) IOC: 控制反转,把创建对象过程交给Spring进行管理;

    (2) AOP: 面向切面,不修改源代码,进行功能增强。

1.2 Spring特点:

  1. 方便解耦,简化开发;(IOC)
  2. AOP编程支持;
  3. 方便程序测试;
  4. 方便和其他框架进行整合;
  5. 方便进行事务操作;
  6. 降低API开发难度。

1.3  Spring组成

        Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式 。

        组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。

  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

  • Spring MVC 框架MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

二、IOC容器:

        控制反转,就是将对象创建和对象之间的调用过程,交给Spring进行管理,使用IOC的目的就是降低耦合度。

        ​​​​​​​控制反转通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

2.1  spring示例:

创建一个普通类:

public class User {private String name;private String password;public void setName(String name) {this.name = name;}public void setPassword(String password) {this.password = password;}public String getName() {return name;}public String getPassword() {return password;}@Overridepublic String toString(){return "name:"+name+" ,"+"password:"+password;}
}

创建XML配置文件,在配置文件配置创建的对象:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.wyf.beantest.User"><property name="name" value="wyf"></property><property name="password" value="pwd"></property></bean>
</beans>

编写测试代码:

    @Testpublic void userTest(){//加载spring配置文件ApplicationContext context = new ClassPathXmlApplicationContext("springbean.xml");User user = context.getBean("user",User.class);System.out.println(user.toString());}

上例是一个IOC控制反转的例子,其中:

  • user对象是由Spring创建
  • user对象的属性也是由spring容器进行设置

以上过程充分体现了控制反转,也是spring思想的精髓 : 

  • 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring进行创建。

  • 反转 : 程序本身不创建对象 , 而变成被动的接收对象

2.2 IOC底层原理:

IOC的底层主要用到了三个技术,分别是:

  • XML解析
  • 工厂模式
  • 反射

2.2.1 工厂模式解耦 

      如下图,我们有两个类,分别为UserService类(包含方法execute)和UserDao(包含方法add),我们在UserService类中调用UserDao类的add方法,传统方法使用new的方式,在UserService类中创建UserDao对象,然后调用UserDao的add方法。这种方式虽然能够达到目的,但是UserService类和UserDao类的关联度太高了,也就是耦合度太高了。UserDao类的改变会导致UserService类也必须做出相应的变化。

         针对传统模式存在的耦合度高的问题,我们可以采用工厂模式,一定程度上降低耦合,如下图所示。我们依然存在两个类,UserService类(包含方法execute)和UserDao(包含方法add),同样在UserService类中调用UserDao的add方法,采用传统方式,耦合度太高。我们可以创建一个工厂类UserFactory,该类中包含一个返回值为UserDao的静态方法,当UserService需要UserDao时,可以通过调用工厂类UserFactory中的方法获得,这样,我们就降低了UserService类和UserDao类之间的耦合度。这种方式虽然将UserService和UserDao进行了解耦,但是,也存在新的问题,就是将UserService和UserFactory进行了耦合,实际中不可能消除耦合,我们最终的目的是将耦合度降到最低。该例还可以继续降低耦合,就是IOC控制反转。

 2.2.2 IOC解耦

        IOC的解耦过程如下所示: 

         IOC进行解耦时,第一步我们需要在xml配置文件中配置创建的对象(如上例中所示的配置文件),第二步,当我们需要某个配置文件中的类时,我们可以创建一个工厂类,在工厂类中我们首先通过解析XML文件,获取类的配置信息,然后通过反射创建并获取到这个类。

2.3 IOC接口:

         IOC思想基于IOC容器完成,IOC容器底层(本质上)就是对象工厂。spring提供了两种方式IOC容器的实现(两个接口):

  • BeanFactory接口:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用 。 * 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象 
  • ApplicationContext接口:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用。* 加载配置文件时候就会把在配置文件对象进行创建 

ApplicationContext接口的实现类:

三、结束

        本文简单介绍了spring框架,并简单介绍了IOC控制反转的底层原理,其主要基于XML解析工厂模式以及反射实现。

        


http://chatgpt.dhexx.cn/article/YoteFiE5.shtml

相关文章

控制反转(IOC)简介

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

IoC 控制反转理解

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

IOC控制反转理解

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

C# IoC控制反转学习笔记

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

spring -- 控制反转IOC

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

Java:控制反转

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

IoC控制反转

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

IOC 控制反转

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

浅谈控制反转(IoC)

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

Spring---浅谈IOC

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

控制反转-Inversion Of Control

一、控制反转 控制反转&#xff08;Inversion of Control&#xff0c;英文缩写为IoC&#xff09;把创建对象的权利交给框架&#xff0c;是框架的重要特征&#xff0c;并非面向对象编程的专业术语。它包括依赖注入&#xff08;Dependency Injection&#xff0c;简称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的题目&#xff0c;LSB原理进行图片隐写 LSB原理 LSB是一种利用人类视觉的局限性设计的幻术 PNG和BMP图片中的图像像素一般是由RGB(RED红 GREEN绿 BLUE蓝)三原色组成 记住&#xff0c;JPG图片是不适合使用LSB隐写的&#xff0c;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发行版本&#xff1a;lsb_release -a 运行该命令时若提示lsb_release命令不存在 不存在&#xff0c;则表明系统未安装该命令&#xff0c;报错如下&#xff1a; 解决方法&#xff1a; 查看 lsb_release 命令属于哪个软件包&#xff0c;命令为yum provides */lsb_rel…

图片LSB隐写(java)

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

LSB隐写术

前言 LSB全称为 least significant bit&#xff0c;是最低有效位的意思。Lsb图片隐写是基于lsb算法的一种图片隐写术&#xff0c;以下统称为lsb隐写&#xff0c;这是一种常见的信息隐藏方法。当然关于图像的隐写的方法有很多&#xff0c;统称为隐写术&#xff0c; lsb隐写很实…

Linux开发标准LSB简介:Linux Standard Base

目录 Unix/Linux 标准化历史 POSIX Open Group Austin Group LSB LSB 简介 组织架构 工作组 LSB 的标准化流程 认证 认证问题报告 LSB 的历史、现状和将来 实例&#xff1a;lsb_release 的规范定义和实现 结束语 Unix/Linux 标准化历史 标准化目前已经成为 Linu…

LSB 简介

Unix/Linux 标准化历史 标准化目前已经成为 Linux 系统上的一个热门话题。实际上&#xff0c;在 Linux 诞生之初&#xff0c;这个问题就得到了重视。当 Linus 在开发 0.01 版本的 Linux 内核时&#xff0c;就开始关注 POSIX 标准的发展&#xff0c;他在 /include/unistd.h 文件…