如果我们需要一个对象,通常的方式,我们是通过直接创建的方式,也就是new方法来创建:
传统方式实现:
(1)Service接口
public interface UserService {
void getUser(String id);
}
(2)ServiceImpl实现类
public class UserServiceImpl implements UserService {
//把dao引入到serviceImpl
UserDao userDao = new UserDaoImpl();
public void getUser(String id){
string a=userDao.queryId(id);
}
}
(3)UserDao接口
public interface UserDao {
@Query(value = "select id from student where is_delete = 0 )
String queryId(String id);
}
(5)测试类
public class Test {
public static void main(String[] args) {
UserServiceImpl userServiceImpl = new UserServiceImpl();
userService.getUser();
}
}
小结:传统应用程序创建对象的方式,每次用到我们都需要自己去创建,如果我们需要扩展一个接口,还要相应的增加好几个实现类,这会导致类与类之间高耦合,难于测试。
我们来思考一个问题,我们真的需要每次都去自己创建对象么?我们需要的对象是对象本身 ,还是他所提供的服务?如果我们只是需要它所提供的服务,那么,只要我们用到的时候能享受到它带来的服务,至于他是怎么来的对我们来说就不重要了。
ioc引入:
Ioc全称Inversion of Control,即“控制反转”,是一种设计思想。要想理解Ioc,我们首先要知道“谁控制谁,控制什么,什么是反转,反转了什么”
●谁控制谁?
IoC 容器控制了对象的创建
传统程序设计,我们直接在对象内部通过new进行对象创建,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建。
● 控制什么?
控制了对象的创建,更准确来说是控制了外部资源获取(不仅仅包括对象的创建)
●什么是反转?
有反转就一定有正转,传统程序设计是由我们主动去创建对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象,我们直接被动接受就可以了,所以是反转
●反转了什么
依赖对象的获取被反转了,ioc容器直接帮我们做了
小结:ioc就相当于一个中介,我们把我们的要求告诉中介,中介根据我们的要求争去寻找我们想要的,最后把我们要的给我们。我们需要做的只是告诉他们我们的要求和得到我们想要的,这也就是ioc所做的,需要什么东西让别人送过来,省去了自己的一系列操作。