Sobes.tech
Middle

Spring Bean ilə asılılıqların injeksiyasını necə tətbiq etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Spring IoC konteyneri Spring Bean-lərinin (obyektlərin) həyat dövrünü idarə edir. Beans Spring tətbiqlərinin əsas tikinti bloklarıdır. Spring Bean-lərindən istifadə etməklə asılılıqların (DI) daxil edilməsi, konteynerə komponentlərin necə yaradılacağını və əlaqələndiriləcəyini göstərən konfiqurasiyalar vasitəsilə həyata keçirilir.

Spring-də asılılıqların daxil edilməsinin üç əsas yolu var:

  1. Konstruktor vasitəsilə daxil etmə: Spring Bean yaradılarkən müvafiq sinif konstruktorunu çağırır. Bu, bütün lazımi asılılıqların obyekt yaradılarkən initializə olunmasını təmin etdiyi üçün üstünlük verilən yoldur və asılılıqları dəyişməz edə bilir.
  2. Setter vasitəsilə daxil etmə: Spring, Bean yaradıldıqdan sonra asılılıqları təyin etmək üçün setter metodlarını çağırır. Bu, opsional asılılıqlar üçün faydalıdır.
  3. Sahə vasitəsilə daxil etmə: Spring refleksi istifadə edərək, asılılıqları birbaşa sinifin sahələrinə daxil edir. Bu, tövsiyə edilmir, çünki test etməyi çətinləşdirir və inkapsulyasiyanı pozur.

Asılılıqların daxil edilməsi üçün konfiqurasiya aşağıdakı vasitələrlə həyata keçirilə bilər:

  • Əlavələr: @Autowired, @Qualifier, @Value. Bu, müasir Spring tətbiqlərində ən çox istifadə olunan yanaşmadır.

    // Konstruktor vasitəsilə daxil etmə nümunəsi ilə anotasiya
    @Component // Sinifi Spring Bean edir
    public class MyService {
    
        private final MyDependency dependency;
    
        @Autowired // Spring-ə bildirir ki, asılılığı konstruktor vasitəsilə daxil etsin
        public MyService(MyDependency dependency) {
            this.dependency = dependency;
        }
    
        // ...
    }
    
    @Component
    public class MyDependency {
        // ...
    }
    
    // Setter vasitəsilə daxil etmə nümunəsi ilə anotasiya
    @Component
    public class AnotherService {
    
        private AnotherDependency dependency;
    
        @Autowired // Spring asılılığı setter vasitəsilə daxil edir
        public void setDependency(AnotherDependency dependency) {
            this.dependency = dependency;
        }
    
        // ...
    }
    
    @Component
    public class AnotherDependency {
        // ...
    }
    
    // Sahə vasitəsilə daxil etmə nümunəsi ilə anotasiya (tövsiyə edilmir)
    @Component
    public class FieldInjectedService {
    
        @Autowired // Spring asılılığı sahəyə birbaşa daxil edir
        private FinalDependency dependency;
    
        // ...
    }
    
    @Component
    public class FinalDependency {
        // ...
    }
    
  • XML konfiqurasiya: Köhnə və ya xüsusi layihələrdə istifadə olunur.

    <!-- Konstruktor vasitəsilə XML-də daxil etmə nümunəsi -->
    <beans>
        <bean id="myDependency" class="com.example.MyDependency"/>
    
        <bean id="myService" class="com.example.MyService">
            <constructor-arg ref="myDependency"/>
        </bean>
    </beans>
    
    <!-- Setter vasitəsilə XML-də daxil etmə nümunəsi -->
    <beans>
        <bean id="anotherDependency" class="com.example.AnotherDependency"/>
    
        <bean id="anotherService" class="com.example.AnotherService">
            <property name="dependency" ref="anotherDependency"/>
        </bean>
    </beans>
    
  • Java konfiqurasiyası (@Configuration@Bean): Müasir yanaşma, Spring konteynerini Java kodu ilə konfiqurasiya etməyə imkan verir.

    // Java konfiqurasiya nümunəsi
    @Configuration // Konfiqurasiya sinfi olduğunu göstərir
    public class AppConfig {
    
        @Bean // myDependency Bean-ini elan edir
        public MyDependency myDependency() {
            return new MyDependency();
        }
    
        @Bean // myService Bean-ini elan edir
        public MyService myService(MyDependency myDependency) {
            // Konstruktor vasitəsilə inject
            return new MyService(myDependency);
        }
    }
    

Spring IoC konteyneri konfiqurasiyanı (anotasiya, XML, Java sinifləri) skan edir, Bean nümunələrini yaradır, onların həyat dövrünü idarə edir və avtomatik olaraq asılılıqları daxil edir. Bu, komponentlər arasındakı əlaqəni azaldır, test etməyi asanlaşdırır (asılılıqları asanlıqla mock obyektlərlə əvəz etmək mümkündür) və kodu daha asan dəstəklənən edir.