计算机系统应用教程网站

网站首页 > 技术文章 正文

【Spring框架精讲1】一文搞懂Spring IoC控制反转(附实战代码详解)

btikc 2024-10-15 09:02:54 技术文章 10 ℃ 0 评论

大家好,这里是老K分享的全网最完整的Java系列教程。

本期开始,我们要开启一个新的里程,了解和介绍一下Java最经典和实用的框架Spring,以及Spring的核心思想IoC控制反转。

关于Spring框架的内容有很多,可以先关注、收藏,慢慢阅读和吸收。


一、关于Spring

Spring是当下应用最广泛的Java框架,经过十几年的演进和发展,已经从一个基于J2EE的开源应用框架,发展成了全世界最大的Java框架生态体系。

Spring存在的目的是解决和降低企业应用开发的复杂性,为企业级应用的开发提供一套简洁且行之有效的标准方案。可以说,但凡你想从事Java工程师这个行业,就需要先熟悉Spring这个工具。

这里是Spring的官网:Spring-Website

Spring发展至今,已经衍生出很多基于Spring但功能各异的框架组件,形成一整套Spring生态。

以下是一些Spring核心的模块:

  • Spring Framework:Spring的核心组件,用于开发应用,能有效降低开发和配置的复杂度;
  • Spring Boot:基于Spring的轻量级应用开发框架;
  • Spring Cloud:一系列框架的集合,用于开发分布式系统,能简化基础设施的配置;
  • Spring Cloud Data Flow:便捷生成流式数据的框架,以满足微服务项目的数据传输要求;
  • Spring Data:提供基于Spring的数据层模型;
  • Spring Integration:轻量级的Spring企业集成扩展;
  • Spring Batch:用于批处理的轻量级框架;
  • Spring Security:安全的授权准入控制框架;
  • ......

学习Spring,首先是了解其最基本和核心的内容——Spring Framework(可移步至官网了解信息spring.io/projects/spring-framework/).


二、关于IoC控制反转

IoC是Spring的核心思想,IoC即英文控制反转Inversion of Control的首字母。

2.1 概念

控制反转的核心思想是:让对象从传统的基于new关键词或工厂方法的依赖关系中脱离出来,由Spring容易来负责管理的思想。

这样做的好处在于:

  • 更灵活:Spring容器是由配置文件来实现依赖关系的,所以不需要修改代码就能更新对象;
  • 易测试:由于对象是从外部注入,使单元测试更容易;
  • 低耦合:由外部容器管理对象之间的依赖关系,降低了系统的耦合度,提高了可扩展性。

2.2 传统依赖

以上这些概念可能太抽象了,所以我们接下来通过一组代码实例来认识一下IoC控制反转:

我们用最经典的苹果案例来说明一下传统依赖关系,新建一个maven项目,然后先设计一个Apple类:

  • Apple.java
public class Apple {
    private String title;
    private String color;
    private String origin;

    public Apple() {
    }

    public Apple(String title, String color, String origin) {
        this.title = title;
        this.color = color;
        this.origin = origin;

    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "title='" + title + '\'' +
                ", color='" + color + '\'' +
                ", origin='" + origin + '\'' +
                '}';
    }
}

传统的对象是通过new关键词完成对象的实例化:

  • App.java
import Apple;

public class App {
    public static void main(String[] args) {
        Apple apple = new Apple("红富士", "红色", "欧洲");
        System.out.println(apple.toString());
    }
}

上述情形中,通过new将对象写入程序。这样的缺点在于,这时候这个apple以及它的各项属性都写入到程序中,成为程序的一部分。整个程序系统耦合度相当高,当后续要对对象的性质、内容进行调整,就要重新开发、测试、审批、上线。

2.3 Spring控制反转下的对象依赖

上述情况,通过Spring可以有效降低耦合。

我们先对项目进行一些配置和准备:

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.koder</groupId>
    <artifactId>KoderSpring</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
    </dependencies>

</project>
  • 通过上述配置,完成SpringFramework的安装和配置。

然后我们再在resources目录下配置一个context.xml

  • context.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="apple" class="Apple">
        <property name="title" value="红富士"/>
        <property name="origin" value="欧洲"/>
        <property name="color" value="红色"/>
    </bean>
</beans>
  • 这时候,IDEA程序会检测到文件为Spring配置文件,会询问“Configure Application Context”,选择配置即可;
  • beans标签是标准写法,来自官网示例代码;
  • bean标签就是Spring体系下的对象实体,配置bean的过程等同于在java中配置一个实例的过程;
  • 配置属性id的值,相当于给这个实例一个变量名;
  • 配置属性class的值,就相当于给实例找到匹配的类;
  • 配置property就相当于给对应的属性赋值;
  • 上述配置就相当于在java中的下述代码,差别就是这是写在配置文件中,不会造成程序的耦合:
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");

然后,我们就可以通过java程序,把配置文件中的bean实体引入到程序中来:

  • App.java
import Apple;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:context.xml");
        Apple apple = context.getBean("apple", Apple.class);
        System.out.println(apple.getTitle());
    }
}
  • 通过ClassPathXmlApplicationContext类加载context配置文件,传入的路径是编译后target目录下的相对路径;
  • 路径表达式以classpath:开头,然后跟配置文件在target目录下相对路径;
  • 通过ClassPathXmlApplicationContext加载得到的ApplicationContext类,可以调用配置文件中的bean
  • 通过getBean获取配置文件中的bean实体,其中第一个参数和bean标签中的id值一致,第二个参数是改bean的class类;
  • 这样得到的apple就和传统new关键词一样,但并没有把对象的创建配置和程序本身绑定在一起,当需要调整对象时,无需调整程序,仅修改配置文件即可;
  • 小伙伴可以修改context.xml,查看不同结果.

结尾

以上就是简单实现Spring Ioc控制反转功能基本步骤。

通常说的IoC容器就是指context.xmlbeans标签,就像一个容器一样,容纳各种通过bean生成的对象实例;

IoC控制反转并不是一个非常难懂的知识点,主要还是体现在编程思想的理解上,掌握并不难,但需要花时间理解其背后的编程思想,才能在工作中正在帮到我们,提高我们的开发效率。

最后,如果你觉得这篇文章对你有帮助,可以选择收藏一下。如果你愿意,也可以顺手点个赞~

结束语

我是专注于开发领域的 @老K玩代码 ,会持续生产关于如何学习编程语言的优质内容。

如果你想学习Java编程,或者想精进你的Java编程能力,可以关注我。

如果你对开发、编程有任何疑问或者有想了解的内容,而我暂时没有写到的,也欢迎随时来找我聊聊。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表