依賴注入和控制反轉

一、依賴注入

依賴注入(Dependency Injection,DI)是一個設計模式,主要目的是為了降低代碼之間的耦合性。它通過把類之間的依賴關係轉移到容器中,從而實現解耦的效果。實現依賴注入通常有三種方式:

1、構造函數注入:將依賴作為構造函數的參數傳入。


  public class UserServiceImpl implements UserService {
      private UserDao userDao;

      public UserServiceImpl(UserDao userDao) {
          this.userDao = userDao;
      }
  }

2、Setter注入:使用Setter方法對依賴進行設置。


  public class UserServiceImpl implements UserService {
      private UserDao userDao;

      public void setUserDao(UserDao userDao) {
          this.userDao = userDao;
      }
  }

3、介面注入:使用介面對依賴進行注入。


  public interface UserRepository {
      // ...
  }

  public class UserRepositoryImpl implements UserRepository {
      // ...
  }

  public class UserServiceImpl implements UserService {
      private UserRepository userRepository;

      @Inject
      public void setUserRepository(UserRepository userRepository) {
          this.userRepository = userRepository;
      }
  }

依賴注入雖然可以使用簡單的技術來實現,但是必須遵循一些規則才能發揮作用。比如,依賴注入容器必須知道如何創建依賴,同時也必須知道如何注入它們。在依賴注入中,存在三種不同的對象類型:

1、客戶端對象:包含依賴項的對象。

2、服務對象:提供服務的對象,可能包含客戶端對象。

3、依賴對象:被服務對象所依賴的對象。

二、控制反轉

控制反轉(Inversion of Control,IoC)也是一個設計模式,主要思想是將控制權從程序中轉移到容器中。我們通過依賴注入來告訴容器哪些對象需要哪些依賴,容器在啟動時自動裝配依賴關係。

控制反轉有兩種實現方式:

1、通過工廠模式實現控制反轉


  // 工廠模式
  public class UserControllerFactory {
      public static UserController create() {
          UserDao userDao = new UserDaoImpl();
          UserService userService = new UserServiceImpl(userDao);
          return new UserController(userService);
      }
  }

  public class UserController {
      private UserService userService;

      public UserController(UserService userService) {
          this.userService = userService;
      }

      // ...
  }

2、通過註解實現控制反轉


  public class UserController {
      @Inject
      private UserService userService;

      // ...
  }

  public class UserServiceImpl implements UserService {
      @Inject
      private UserDao userDao;

      // ...
  }

通過上述代碼可以看出,通過引入依賴注入可以幫助我們實現控制反轉。通過註解或者工廠模式實現依賴注入,並通過容器自動實現依賴注入組裝。

三、依賴注入和控制反轉的區別

依賴注入和控制反轉是兩個獨立的概念,但是它們通常被放在一起談論。依賴注入是一種機制,在這種機制下,控制反轉可能會發生。

區別:

依賴注入:是為了降低代碼之間的耦合性,解耦點是在代碼中指定某些對象的依賴關係的地方。

控制反轉:是一種通用的設計模式,解耦點在IoC容器之間,容器將程序控制器傳遞給程序。

依賴注入和控制反轉的關係:依賴注入是容器實現控制反轉的手段,依賴注入主要是依靠IoC容器將對象之間的依賴關係進行管理,達到解耦的目的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186135.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-26 21:10
下一篇 2024-11-27 05:44

相關推薦

發表回復

登錄後才能評論