依赖注入和控制反转(图文详解)

依赖注入和控制反转(图文详解)-mikechen

依赖注入和控制反转是Spring编程中经常遇到的问题,下面我就来分别详解依赖注入和控制反转@mikechen

控制反转

控制反转简介

控制反转,英文全称是Inversion of Control,简称IoC,则是一种设计模式。

 

控制反转思想

控制反转的主要思想:是将程序的控制权从应用程序代码中抽离出来,转交给一个框架或容器,由它来管理对象的创建和依赖关系。

如下图所示:
依赖注入和控制反转(图文详解)-mikechen

上图引入了IOC控制反转,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了。

控制反转的目的是解耦应用程序中各个组件之间的依赖关系,从而提高程序的灵活性和可维护性。

比如:在没有通过控制反转解耦之前,对象依赖关系是这样的:

依赖注入和控制反转(图文详解)-mikechen

可以看出,对象之间的依赖关系是高耦合,难于测试的,加入控制反转后,我们再看:

依赖注入和控制反转(图文详解)-mikechen

依赖关系就被IOC控制反转解耦了,从而实现程序模块之间的解耦和灵活性的提高。

 

依赖注入

依赖注入(Dependency Injection,简称DI)是一种编程技术,它的主要思想是通过参数或属性的方式向一个对象中注入它所依赖的其他对象,从而完成对象之间的解耦。

在传统的面向对象编程中,一个对象通常需要自己创建和管理它所依赖的对象。

这样做会使得对象之间的依赖关系变得非常复杂,而且会造成代码的耦合度很高,不利于代码的维护和扩展。

而依赖注入则是通过将对象之间的依赖关系从代码中抽离出来,交由外部容器来管理,从而降低代码的耦合度,提高代码的可读性和可维护性。

依赖注入通常有三种方式:构造函数注入、属性注入和接口注入。

1.构造函数注入

public class UserServiceImpl implements UserService {
   private final UserDAO userDAO;

   public UserServiceImpl(UserDAO userDAO) {
      this.userDAO = userDAO;
   }

   // ...
}

在这个例子中,创建一个名为“userService”的bean,并将一个名为“userDao”的bean作为构造函数的参数传递进去。

 

2.属性注入

public class UserController {
   private UserService userService;

   public void setUserService(UserService userService) {
      this.userService = userService;
   }

   // ...
}

在这个例子中,创建一个名为“userService”的bean,并将一个名为“userDao”的bean注入到它的“userDao”属性中。

总之,依赖注入是一种通过参数或属性的方式向一个对象中注入它所依赖的其他对象的技术,它能够降低代码的耦合度,提高代码的可读性和可维护性。

以上就依赖注入和控制反转详解,更多Spring请查看:Spring教程(史上最全图文详解)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法