Sobes.tech
Middle

Koja je razlika između inverzije kontrole (IoC) i injekcije zavisnosti?

sobes.tech АИ

Одговор од АИ

Инверзија контроле (IoC) је општи принцип дизајна према којем се ток контроле програма мења: уместо да управља експлицитно зависностима и логиком њиховог позивања, компоненту се ослања на спољашњи оквир или контејнер који управља тим током.

Уметање зависности (DI) је један од конкретних образаца који имплементирају принцип IoC. Он се састоји у преносу зависности (објеката од којих зависи тренутна компонента) споља, уместо да их компонента сама креира или тражи.

Стога, DI је начин постизања IoC.

Главне разлике:

  • IoC — принцип/концепт.
  • DI — образац/реализација.
  • IoC може бити реализован различитим начинима (нпр. фабрички метод, локатор сервиса), DI је један од тих начина.
  • IoC преноси одговорност за креирање и повезивање објеката од компонента на оквир/контејнер.
  • DI реализује овај пренос, преносећи зависности кроз конструктор, сеттер или интерфејс.

Пример DI (конструктор):

// класа која зависи од Service
public class Client {
    private final Service service;

    // Конструктор прихвата зависност (Service)
    public Client(Service service) {
        this.service = service;
    }

    public void doSomething() {
        service.execute();
    }
}

// интерфејс зависности
public interface Service {
    void execute();
}

// конкретна реализација зависности
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Извршавање услуге...");
    }
}

// класа одговорна за "инјекцију"
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // креирање зависности
        Client client = new Client(myService); // инјекција зависности преко конструктора
        client.doSomething();
    }
}

У овом примеру, класа Client не креира директно ServiceImpl. Уместо тога, ServiceImpl се креира негде другде (AppConfig) и преноси се (инјектира) у Client преко његовог конструктора. Ово реализује принцип IoC, јер је управљање креирањем и повезивањем Service обрнуто — није у Client-у.