• 如何理解Spring中的IOC



    前言

    ``


    一、核心概念(必会!!)

    要想理解IOC,必须要先理解一些相关的核心概念。

    1.1 什么是IOC(控制反转)?

    使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

    Spring技术对IOC思想进行了实现,下面来看与之相关的概念。

    1.2 什么是IOC容器?

    Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的外部 (上述IOC概念提到的外部).

    1.3 什么是Bean?

    IOC容器负责对象的创建、初始化等一系列操作,被创建或被管理的对象在IoC容器中统称为Bean.

    1.4 什么是DI(依赖注入)?

    在容器中建立Bean与Bean直接的依赖关系的整个过程,称为依赖注入。

    例:service业务层 需要依赖于数据访问层Dao 对象才能运行,那么我们需要在业务层创建一个Dao对象。
    在IoC容器中,service和Dao对象都被包含在其中,所以我们可以直接靠Spring的IOC容器帮我们创建一个DAO对应的Bean.
    在这里插入图片描述
    在这里插入图片描述

    1.5 充分解耦

    上述的目标都是为了充分解耦这个重要的目标。实现原理:

    • 使用IoC容器管理Bean(IoC)
    • 在IoC容器内将有依赖关系的Bean进行绑定(DI)

    效果:使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。

    二、IoC入门案例思路分析(XML版)

    2.1 不用IOC实现案例

    我们先来看一个不用IOC的简单案例:
    1、先创建一个web项目,项目结构如下
    在这里插入图片描述

    2、Dao层代码:
    2.1 接口:

    package com.tzw.dao;
    
    /**
     * @author tzw
     * @version 1.0
     */
    public interface BookDao {
        public void save();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.2 实现类:

    package com.tzw.dao.impl;
    import com.tzw.dao.BookDao;
    public class BookDaoImpl implements BookDao {
        @Override
        public void save() {
            System.out.println("book  Dao save... ");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、service 层接口代码:

    package com.tzw.service;
    
    public interface BookService {
        public  void save();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    service实现类代码:

    package com.tzw.service.impl;
    
    import com.tzw.dao.BookDao;
    import com.tzw.dao.impl.BookDaoImpl;
    import com.tzw.service.BookService;
    
    public class BookServiceImpl implements BookService {
        private BookDao bookDao = new BookDaoImpl();
        @Override
        public void save() {
            System.out.println("book  service save ....");
            bookDao.save();
        }
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4、测试类代码:

    package com.tzw;
    
    import com.tzw.service.BookService;
    import com.tzw.service.impl.BookServiceImpl;
    public class App {
        public static void main(String[] args) {
            BookService bookService = new BookServiceImpl();
            bookService.save();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5、输出结果:
    在这里插入图片描述

    2.2 使用IOC

    
    
    • 1

    IOC容器管理什么?( Service与Dao )

    如何将被管理的对象告知IoC容器?(配置)

    被管理的对象交给IoC容器,如何获取到IoC容器?(接口)

    IoC容器得到后,如何从容器中获取bean ?(接口方法)

    使用Spring导入哪些坐标? ( pom.xml )

    2.2.1 步骤一:导入Spring坐标

    在pom.xml中导入坐标依赖。

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.8.RELEASE</version>
      </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2.2 步骤二:定义Spring管理的类和接口

    参照上述案例中的Dao层和Service层代码。

    2.2.3 步骤三:创建Spring配置文件,配置对应类作为Spring管理的Bean

    在Resource资源目录下创建一个Spring config类型的文件,命名为application-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
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="bookService" class="com.tzw.dao.impl.BookDaoImpl"/>
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:bean定义时id属性在同一个上下文中不能重复

    2.2.4 步骤四:初始化IoC容器(Spring核心容器),通过容器获取Bean

    package com.tzw;
    import com.tzw.service.BookService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class App02 {
        public static void main(String[] args) {
    //        3、获取IOC容器
            ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            BookService bookService = (BookService)app.getBean("bookService");//首字母一定要小写!!
            bookService.save();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注意事项:
    在获取Bean的时候,参数首字母一定要小写,不然在容器中就找不到对应的bean!!

    三、DI入门案例思路分析

    1、虽然使用了IoC,但是还是有耦合的现象。但是Service层还是存在new对象的情况,所以我们要考虑的是,如何让Servicex需要的dao对象进入到Service中?

    步骤:
    一、我们删掉在Service层中new出Dao对象的代码,我们只声明一个DAO对象,然后给它一个set方法(容器调用)。我们让容器帮我们创建对应的bean对象(这里的bean为dao对象)
    在这里插入图片描述
    2、怎么让容器知道我们要在哪里创建什么对象呢?我们需要在配置文件中配置(用到DI,依赖注入),因为Dao对象是放在Service里面的,所以Service依赖于dao,我们需要在service的标签下表示出它们的关系(绑定)

        <bean id="bookDao" class="com.tzw.dao.impl.BookDaoImpl"/>
    
        <bean id="bookService" class="com.tzw.service.impl.BookServiceImpl">
            <!-- 配置ServiceDao的关系-->
    <!--        property标签表示配置当前bean的属性-->
    <!--        name属性表示配置哪一个具体的属性-->
    <!--            ref表示参照哪一个bean-->
            <property name="bookDao" ref="bookDao"/>
        </bean>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、测试,仍然能实现。
    在这里插入图片描述


  • 相关阅读:
    千年版本修改小技巧
    paddlepaddle 29 搭建基于卷积的自动编码机
    音视频学习 - QT6.3.1创建QAudioSink+ ffmpeg项目进行音频解析及播放
    新手如何学习挖漏洞?看这篇就够了【网络安全】
    OpenAI新模型发布,免费开放GPT-4o!但只开放一点点...
    java计算机毕业设计学生社团管理与评价系统源码+系统+lw+数据库+调试运行
    Liunx 重置MySQL用户密码
    使用canvas做了一个最简单的网页版画板,5分钟学会
    学习记录639@python机器学习模型部署与访问实战-基于Flask
    axios发post请求,后端接收不到参数的原因及解决
  • 原文地址:https://blog.csdn.net/qq_45821255/article/details/126260556