依賴注入(Dependency Injection,DI)是一種設(shè)計模式,它通過將對象之間的依賴關(guān)系的創(chuàng)建和維護(hù)轉(zhuǎn)移到外部容器中來,以減少對象之間的緊耦合性和提高可重用性。
在傳統(tǒng)的程序設(shè)計中,對象通常通過直接創(chuàng)建和維護(hù)依賴關(guān)系來使用其他對象。這種方法會導(dǎo)致對象之間的緊耦合性,使代碼難以維護(hù)和擴(kuò)展。而依賴注入模式將對象之間的依賴關(guān)系的創(chuàng)建和維護(hù)轉(zhuǎn)移到外部容器中,使對象更加松散耦合,并且可以方便地更改依賴項的實(shí)現(xiàn)類,而無需修改受影響的對象的代碼。
例如,假設(shè)我們有一個需要使用消息服務(wù)的應(yīng)用程序類:
public class MyApplication {
private final MessageService messageService;
public MyApplication() {
// 創(chuàng)建一個 EmailService 實(shí)例
messageService = new EmailService();
}
public void sendNotification(String message, String recipient) {
messageService.sendMessage(message, recipient);
}
}
在上面的代碼中,MyApplication 類依賴于 EmailService 類。這種方法導(dǎo)致 MyApplication 類與 EmailService 類緊密耦合,難以進(jìn)行單元測試,并且難以更改使用的消息服務(wù)。
使用依賴注入,我們可以通過將依賴項傳遞到 MyApplication 類的構(gòu)造函數(shù)中來實(shí)現(xiàn)解耦:
public class MyApplication {
private final MessageService messageService;
public MyApplication(MessageService messageService) {
this.messageService = messageService;
}
public void sendNotification(String message, String recipient) {
messageService.sendMessage(message, recipient);
}
}
現(xiàn)在,我們可以在創(chuàng)建 MyApplication 實(shí)例時傳遞不同的 MessageService 實(shí)現(xiàn)類,以更改應(yīng)用程序使用的消息服務(wù)。這樣,我們可以方便地更改依賴項的實(shí)現(xiàn)類,而無需修改 MyApplication 類的代碼。