开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
什么是IOC:控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低
首先提出一个问题:如果现在有两个类,一个是UserService,一个是UserDao。UserDao中有一个方法add(),我们想在UserService的execute()方法中调用add方法,改如何做?
最简单的方式当然是实例化对象,
具体代码:
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();
}
}
思路图:
这样确实降低了UserDao和UserFactory的耦合度,但是UserService和UserDao之间的耦合度还是比较高,并没有使耦合度降到最低。
这就需要用到IOC容器了,下面是IOC容器的原理:
IOC容器帮我们创建对象,不需要程序员去手动创建。IOC就像一个工厂一样,当我们需要一个对象的时候,只需要写java代码或者xml文件,IOC就会在适当的时候创建,通过DI自动注入,我们不需要关心这些bean是如何创建的。DI就像打疫苗一样,我们不需要知道疫苗是如何被制造出来的,只需要到指定点去告诉医务人员要打疫苗,相当于编写java代码或者xml文件,医务人员就会将疫苗注入我们体内。IOC还有一个重要的作用是解耦合。比如我们需要jdbctemplate,使用Druid的数据源,假如jdbctemplate和Druid强耦合在一起,那么我们就无法更换数据源。而IOC会自动地帮我们注入jdbctemplate,让他依赖一个DataSource接口,而不是具体的数据源,这样无论我们使用什么数据源都可以工作。并且IOC管理着许多单例的bean,在我们要使用的时候直接调用即可。