Spring5学习(一):为什么要使用IOC以及IOC容器底层原理

78 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

什么是IOC:控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低

首先提出一个问题:如果现在有两个类,一个是UserService,一个是UserDao。UserDao中有一个方法add(),我们想在UserService的execute()方法中调用add方法,改如何做?

最简单的方式当然是实例化对象,

image.png

具体代码:

UserDao.java:

class UserDao{
	
	public void add(){
		
		System.out.println("hahaha");
	}
}

UserService.java:

public class UserService {
    
    public void execute(){
        
        UserDao dao = new UserDao();
        dao.add();
    }
 
}

但这种方法有个致命的问题,就是耦合度太高。

那我们就要想办法降低耦合度。

首先想到的是工厂设计模式:

我们先建立一个工厂类UserFactory:

public class UserFactory {
 
    public static UserDao getDao(){
 
        return new UserDao();
    }
}

将UserService改为:

public class UserService {
 
    public void execute(){
 
        UserDao dao = new UserFactory().getDao();
    }
}

思路图:

image.png

这样确实降低了UserDao和UserFactory的耦合度,但是UserService和UserDao之间的耦合度还是比较高,并没有使耦合度降到最低。

这就需要用到IOC容器了,下面是IOC容器的原理:

image.png

IOC容器帮我们创建对象,不需要程序员去手动创建。IOC就像一个工厂一样,当我们需要一个对象的时候,只需要写java代码或者xml文件,IOC就会在适当的时候创建,通过DI自动注入,我们不需要关心这些bean是如何创建的。DI就像打疫苗一样,我们不需要知道疫苗是如何被制造出来的,只需要到指定点去告诉医务人员要打疫苗,相当于编写java代码或者xml文件,医务人员就会将疫苗注入我们体内。IOC还有一个重要的作用是解耦合。比如我们需要jdbctemplate,使用Druid的数据源,假如jdbctemplate和Druid强耦合在一起,那么我们就无法更换数据源。而IOC会自动地帮我们注入jdbctemplate,让他依赖一个DataSource接口,而不是具体的数据源,这样无论我们使用什么数据源都可以工作。并且IOC管理着许多单例的bean,在我们要使用的时候直接调用即可。