如何理解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();
}

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... ");
    }
}

3、service 层接口代码:

package com.tzw.service;

public interface BookService {
    
    
    public  void save();
}

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();
    }
}
}

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();
    }
}

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

2.2 使用IOC


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>

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>

注意: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();
    }
}

注意事项:
在获取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>

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


猜你喜欢

转载自blog.csdn.net/qq_45821255/article/details/126260556