Вместо того, чтобы рассказывать всю теорию о IOC / DI, я подумал объяснить на примере.
  Требование: Мы получим некоторый адрес клиента, и нам нужно подтвердить адрес. 
  После некоторой оценки мы подумали об использовании службы проверки адресов Google. 
Устаревший (плохой) подход:
Просто создайте класс AddressVerificationService и реализуйте логику.
Предположим, GoogleAddressVerificationService — это сервис, предоставляемый Google, который принимает адрес в качестве строки и возвращает долготу / широту.
| 1 2 3 4 5 6 7 8 9 | classAddressVerificationService {   publicString validateAddress(String address) { GoogleAddressVerificationService gavs = newGoogleAddressVerificationService();  String result = gavs.validateAddress(address);    returnresult; }} | 
Проблемы с этим подходом:
  1. Если вы хотите изменить своего поставщика услуг проверки адреса, вам нужно изменить логику. 
  2. Вы не можете выполнить модульное тестирование с помощью некоторого фиктивного AddressVerificationService (используя фиктивные объекты) 
По какой-то причине Клиент просит нас поддержать нескольких провайдеров AddressVerificationService, и мы должны определить, какую службу использовать во время выполнения.
Для этого вы можете подумать об изменении вышеуказанного класса, как показано ниже:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | classAddressVerificationService{//This method validates the given address and return longitude/latitude details. publicString validateAddress(String address) {  String result = null;  intserviceCode = 2; // read this code value from a config file  if(serviceCode == 1)  {   GoogleAddressVerificationService googleAVS = newGoogleAddressVerificationService();   result = googleAVS.validateAddress(address);  } elseif(serviceCode == 2)  {   YahooAddressVerificationService yahooAVS = newYahooAddressVerificationService();   result = yahooAVS.validateAddress(address);  }  returnresult; }} | 
  Проблемы с этим подходом: 
 
  1. Всякий раз, когда вам нужно поддержать нового поставщика услуг, вам нужно добавить / изменить логику, используя if-else-if. 
  2. Вы не можете выполнить модульное тестирование с помощью некоторого фиктивного AddressVerificationService (используя фиктивные объекты) 
Подход IOC / DI:
  В вышеупомянутых подходах AddressVerificationService берет на себя управление созданием своих зависимостей. 
  Таким образом, всякий раз, когда происходит изменение в его зависимостях, AddressVerificationService будет меняться. 
Теперь давайте перепишем AddressVerificationService с использованием шаблона IOC / DI.
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | classAddressVerificationService{ privateAddressVerificationServiceProvider serviceProvider;  publicAddressVerificationService(AddressVerificationServiceProvider serviceProvider) {  this.serviceProvider = serviceProvider; }  publicString validateAddress(String address) {  returnthis.serviceProvider.validateAddress(address); }}interfaceAddressVerificationServiceProvider{ publicString validateAddress(String address);} | 
Здесь мы внедряем зависимость AddressVerificationService AddressVerificationServiceProvider.
Теперь давайте реализуем AddressVerificationServiceProvider с несколькими сервисами провайдера.
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | classYahooAVS implementsAddressVerificationServiceProvider{ @Override publicString validateAddress(String address) {  System.out.println("Verifying address using YAHOO AddressVerificationService");  returnyahooAVSAPI.validate(address); }  }classGoogleAVS implementsAddressVerificationServiceProvider{ @Override publicString validateAddress(String address) {  System.out.println("Verifying address using Google AddressVerificationService");  returngoogleAVSAPI.validate(address); }} | 
Теперь Клиент может выбрать, какой сервис Поставщика услуг использовать следующим образом:
| 1 2 3 4 5 6 7 8 | AddressVerificationService verificationService = null;AddressVerificationServiceProvider provider = null;provider = newYahooAVS();//to use YAHOO AVSprovider = newGoogleAVS();//to use Google AVSverificationService = newAddressVerificationService(provider);String lnl = verificationService.validateAddress("HitechCity, Hyderabad");System.out.println(lnl); | 
Для модульного тестирования мы можем реализовать Mock AddressVerificationServiceProvider.
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | classMockAVS implementsAddressVerificationServiceProvider{ @Override publicString validateAddress(String address) {  System.out.println("Verifying address using MOCK AddressVerificationService");  return"<response><longitude>123</longitude><latitude>4567</latitude>"; }}AddressVerificationServiceProvider provider = null;provider = newMockAVS();//to use MOCK AVS  AddressVerificationServiceIOC verificationService = newAddressVerificationServiceIOC(provider);String lnl = verificationService.validateAddress("Somajiguda, Hyderabad");System.out.println(lnl); | 
  С этим подходом мы перечислили проблемы с вышеупомянутыми подходами, не основанными на МОК / DI 
  1. Мы можем предоставить поддержку для любого количества провайдеров, сколько пожелаем.  Просто внедрите AddressVerificationServiceProvider и вставьте его. 
  2. Мы можем выполнить модульное тестирование, используя фиктивные данные, используя Mock. 
Таким образом, следуя принципу внедрения зависимостей, мы можем создавать слабосвязанные и легко тестируемые сервисы на основе интерфейса.
Ссылка: Как я объяснил инъекцию зависимостей в мою команду от нашего партнера по JCG Сивы Редди в блоге « Мои эксперименты по технологии» .