Sobes.tech
Middle

Kako primeniti injekciju zavisnosti pomoću Spring Bean?

sobes.tech АИ

Одговор од АИ

Spring IoC контејнер управља животним циклусом Spring Bean-ова (објеката). Beans су главни грађевински блокови Spring апликација. Уметање зависности (DI) коришћењем Spring Beans реализује се кроз конфигурације које контејнеру указују како да креира и повезује компоненте.

Постоје три главна начина за уметање зависности у Spring:

  1. Уметање преко конструктора: Spring позива одговарајући конструктор класе приликом креирања Bean-а. Ово је пожељан начин јер гарантује да су све потребне зависности иницијализоване приликом креирања објекта и омогућава да зависности буду неизменљиве.
  2. Уметање преко сетера: Spring позива методе-сетере класе за постављање зависности након креирања Bean-а. Ова метода је корисна за опционалне зависности.
  3. Уметање преко поља: Spring користи рефлексију за директно уметање зависности у поља класе. Ово се не препоручује јер отежава тестирање и крши инкапсулацију.

Конфигурација за уметање зависности може бити извршена помоћу:

  • Анотација: @Autowired, @Qualifier, @Value. Најчешћи приступ у савременим Spring апликацијама.

    // Пример уметања преко конструктора са анотацијом
    @Component // Правимо класу Spring Bean
    public class MyService {
    
        private final MyDependency dependency;
    
        @Autowired // Обавештавамо Spring да уметне зависност преко конструктора
        public MyService(MyDependency dependency) {
            this.dependency = dependency;
        }
    
        // ...
    }
    
    @Component
    public class MyDependency {
        // ...
    }
    
    // Пример уметања преко сетера са анотацијом
    @Component
    public class AnotherService {
    
        private AnotherDependency dependency;
    
        @Autowired // Spring умета зависност преко сетера
        public void setDependency(AnotherDependency dependency) {
            this.dependency = dependency;
        }
    
        // ...
    }
    
    @Component
    public class AnotherDependency {
        // ...
    }
    
    // Пример уметања преко поља са анотацијом (не препоручује се)
    @Component
    public class FieldInjectedService {
    
        @Autowired // Spring умета зависност директно у поље
        private FinalDependency dependency;
    
        // ...
    }
    
    @Component
    public class FinalDependency {
        // ...
    }
    
  • XML конфигурација: Користи се у старијим или специјализованим пројектима.

    <!-- Пример уметања преко конструктора у XML -->
    <beans>
        <bean id="myDependency" class="com.example.MyDependency"/>
    
        <bean id="myService" class="com.example.MyService">
            <constructor-arg ref="myDependency"/>
        </bean>
    </beans>
    
    <!-- Пример уметања преко сетера у XML -->
    <beans>
        <bean id="anotherDependency" class="com.example.AnotherDependency"/>
    
        <bean id="anotherService" class="com.example.AnotherService">
            <property name="dependency" ref="anotherDependency"/>
        </bean>
    </beans>
    
  • Java конфигурација (@Configuration и @Bean): Модеран приступ који омогућава конфигурисање Spring контејнера помоћу Java кода.

    // Пример Java конфигурације
    @Configuration // Обележава да је ово конфигурациона класа
    public class AppConfig {
    
        @Bean // Декларише Bean myDependency
        public MyDependency myDependency() {
            return new MyDependency();
        }
    
        @Bean // Декларише Bean myService
        public MyService myService(MyDependency myDependency) {
            // Внедрање преко конструктора приликом креирања Bean-а
            return new MyService(myDependency);
        }
    }
    

Spring IoC контејнер скенира конфигурацију (анотације, XML, Java класе), креира инстанце Bean-ова, управља њиховим животним циклусом и аутоматски врши уметање зависности. Ово смањује повезаност компоненти, олакшава тестирање (можете лако заменити зависности mock објектима) и чини код лакше одрживим.