关于 Spring Ioc,看这一篇就够了!

时间:2022-07-22
本文章向大家介绍关于 Spring Ioc,看这一篇就够了!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

目录

  • 1. 什么是 Ioc
    • 1.1 Ioc 定义
    • 1.2 Ioc 工作流程
  • 2. Ioc 实例
    • 2.1 项目创建
    • 2.2 注意事项

1. 什么是 Ioc

1.1 Ioc 定义

Ioc(Inversion of Control),即 控制反转,是 Spring 框架的核心内容,实际上指的是 对一个对象的控制权的反转,和 OOP 一样,属于一种设计思想。Ioc 表示将我们 设计好的对象交由容器控制,而 不再使用在对象内部直接控制 这种传统方式,而 DI(依赖注入)则是实现 Ioc 的一种方法。

1.2 Ioc 工作流程

Spring Ioc 容器在初始化时先读取配置文件,然后根据配置或元数据来创建与组织对象存入容器中,当程序要使用时再从 Ioc 容器中读取出需要的对象。

2. Ioc 实例

2.1 项目创建

  1. 创建一个 Maven 项目,然后在 pom.xml 中引入 spring-context 以及 Junit 的依赖;
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.7.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>
</dependencies>
  1. resourcees 目录下创建一个 Spring 的配置文件,然后会生成如下包含内容的模板;
<?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">

</beans>
  1. Spring 配置文件创建好之后,就可以在其中配置我们需要注册到 Spring 容器中的 Bean,其中 class 属性用于表示要注册的 Bean 的全路径,而 id 则是 Bean 的唯一标识。
<?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 class="com.cunyu.domain.Book" id="book"/>
</beans>

此处配置的是 com.cunyu.domain 包下的 Book 类,所以需要对应源文件存在,我的 Book 类定义如下:

package com.cunyu.domain;

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Book
 * @date : 2020/7/7 14:10
 * @description : Book 类
 */

public class Book {
    private Integer id;
    private String name;
    private Double price;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }
}
  1. 好了,完成上面的配置之后,我们的 Bean 就已经被注册到 Spring 容器中了,接下来只需要加载这个配置文件,然后利用 getBean() 方法从容器中获取对象即可;
import com.cunyu.domain.Book;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author : cunyu
 * @version : 1.0
 * @className : Main
 * @date : 2020/7/7 14:12
 * @description : 加载 Spring 配置文件
 */

public class TestBook {
    @Test
    public void test(){
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Book book = (Book) applicationContext.getBean("book");
        System.out.println(book);
    }
}

2.2 注意事项

除开上述 ClassPathXmlApplicationContext 的方式加载配置文件之外,还可以利用 FileSystemXmlApplicationContext 的方式,这样的话项目将会从给定的路径中去加载配置文件。

public class Main {
    public static void main(String[] args) {
        FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("/home/cunyu/IDEA/spring-ioc/src/main/resources/applicationContext.xml");
        Book book = (Book) ctx.getBean("book");
        System.out.println(book);
    }
}

此外,不仅可以用 getBean() 方法来获取 Bean,还可以直接通过 Class 来获取 Bean,但此时要求 Bean 只存在一个实例,否则就会导致报错。比如下面的情况就会导致报错:

<?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 class="com.cunyu.domain.Book" id="book1"/>
    <bean class="com.cunyu.domain.Book" id="book2"/>
</beans>