Spring中IOC的实现

188 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

SpringIOC的实现

前言

在我的上一篇博客 Spring相关概念与发展历程,我们了解到什么是IOC以及spring和IOC之间的关系,那么这一篇就让我们来学习 Spring容器IOC的实现

1.1 IOC入门案例

对于入门案例,我们得先分析思路然后再代码实现

1.1.1 入门案例思路分析

(1)Spring是使用容器来管理bean对象的,那么管什么?

  • 主要管理项目中所使用到的类对象,比如(Service和Dao)

(2)如何将被管理的对象告知IOC容器?

  • 使用配置文件

(3)被管理的对象交给IOC容器,要想从容器中获取对象,就先得思考如何获取到IOC容器?

  • Spring框架提供相应的接口

(4)IOC容器得到后,如何从容器中获取bean?

  • 调用Spring框架提供对应接口中的方法

(5)使用Spring导入哪些坐标?

  • 用别人的东西,就需要在pom.xml添加对应的依赖

1.1.2 入门案例代码实现

需求分析:将BookServiceImpl和BookDaoImpl交给Spring管理,并从容器中获取对应的bean对象进行方法调用。

1.创建Maven的java项目

2.pom.xml添加Spring的依赖jar包

3.创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类

4.resources下添加spring配置文件,并完成bean的配置

5.使用Spring提供的接口完成IOC容器的创建

6.从容器中获取对象进行方法调用

步骤1:创建Maven项目

1629734010072.png

步骤2:添加Spring的依赖jar包

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
步骤3:添加案例中需要的类

创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类

public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
public interface BookService {
    public void save();
}
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
步骤4:添加spring配置文件

resources下添加spring配置文件applicationContext.xml,并完成bean的配置

1629734336440.png

步骤5:在配置文件中完成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标签标示配置bean
        id属性标示给bean起名字
        class属性表示给bean定义类型
    -->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/></beans>

==注意事项:bean定义时id属性在同一个上下文中(配置文件)不能重复==

步骤6:获取IOC容器

使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法

public class App {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    }
}
步骤7:从容器中获取对象进行方法调用
public class App {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        bookDao.save();
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}
步骤8:运行程序

测试结果为:

image-20210729184337603.png

总结

IoC的全称是Inversion of Control,翻译过来就是控制反转的意思。以前我们的编码习惯是需要什么对象的时候直接new一个出来就好了,然而有个人突然出来跟我们说以后不需要我们主动去new对象了,我们需要什么对象跟它说它就会为我们准备好,这我们当然是乐意的,这个人就是IoC。控制反转的意思就是我们将对象的创建和管理权交给IoC Service Provider(IoC思想的具体实现)。

使用IoC之前的我们就好比一个大龄青年,想要什么对象都需要自己去找,IoC Service Provider就好比是婚介所,我们只要将我们需要对象的条件告诉它,它就能帮我们在已经在婚介所登记的符合我们条件的对象找出来。在这个例子中可以看出,我们并不是什么都不做,想要什么对象IoC Service Provider就会给我们。首先我们需要先将对象在IoC Service Provider登记,然后在需要某个对象时告诉它我们需要的对象的特征。