一、依賴注入
依賴注入(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