Spring Framework - IoC ve DI Kavramları

Java ile bir program geliştirme aşamasında çeşitli amaçlarda nesneler türetir ve oluşturduğumuz bu nesneleri birbirleri ile ilişkilendiririz. Artık ihtiyaç duyulmadığı taktirde yaşam döngüsü sonucunda Garbage Collector ilgili nesneyi sonlandırır. IoC mekanizması, geliştiricilerin yapmakta olduğu çeşitli kontrollerin kendilerinden alınıp kullanılan ilgili teknolojilere verilmesi işlemidir. Spring Framework ile de bu mekanizma sıklıkla kullanılır ve büyük önem taşır.

IoC altında inceleyeceğimiz bir diğer mekanizma ise bağımlılıkları yönetebilmemizi sağlayan DI yani Dependency Injection kavramıdır. Nesneler arası bağımlılıkları yönetme işlemini biz yazılımcılar değil de Spring’e devrediyoruz. Böylelikle DI sayesinde bağımlılıkların yönetimi daha esnek bırakılarak daha geliştirilebilir bir ortam sunulur. Yani aslında bağımlılıkları kaldırıyoruz ya da soyutluyoruz diyebiliriz. Peki bu nasıl gerçekleşiyor?
Yazılım geliştirme aşamasında kullandığımız ve aralarında bağımlılık ilişkisi bulunan nesneler XML konfigürasyon dosyası aracılığı ile bean tanımlamaları yapılır. Programcı tarafından bağımlılık enjeksiyonu tetiklendiği andan itibaren artık Spring gerekli yerlerde gerekli kontrolleri kendisi sağlamaya başlar. Spring Framework üzerinden bağımlılık enjeksiyonları kurucu metotlar(constructor) ve getter-setter aracılığı ile yapılır.
Bunları örnek üzerinden inceleyelim:

Ulke ve Sehir adında iki adet sınıfımız olsun. Sehir sınıfından bir nesneyi Ulke sınıfı içerisinde kullanarak bağımlılık oluşturalım.

  1. Getter-Setter metotları aracılığı ile bağımlılık enjeksiyonu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Ulke {
private String ulkeAdı;
private Sehir sehir;

public String getUlkeAdı() {
return ulkeAdı;
}

public void setUlkeAdı(String ulkeAdı) {
this.ulkeAdı = ulkeAdı;
}

public Sehir getSehir() {
return sehir;
}

public void setSehir(Sehir sehir) {
this.sehir = sehir;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
public class Sehir {
private String sehirAdı;

public String getSehirAdı() {
return sehirAdı;
}

public void setSehirAdı(String sehirAdı) {
this.sehirAdı = sehirAdı;
}

}

XML konfigürasyon tanımlamaları:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  <bean id="beanSehir" class="dogukansahin.Sehir">
<property name="sehirAdı" value="İstanbul"/>
bean>

<bean id="beanUlke" class="dogukansahin.Ulke">
<property name="ulkeAdı" value="Turkiye"/>
<property name="sehir" ref="beanSehir"/>
bean>
```

2. **Kurucu Metot (Constructor)** aracılığı ile bağımlılık enjeksiyonu:

```JAVA
public class Ulke {
private String ulkeAdı;
private Sehir sehir;

public Ulke(String ulkeAdı, Sehir sehir) {
this.ulkeAdı = ulkeAdı;
this.sehir = sehir;
}

public String getUlkeAdı() {
return ulkeAdı;
}

public void setUlkeAdı(String ulkeAdı) {
this.ulkeAdı = ulkeAdı;
}

public Sehir getSehir() {
return sehir;
}

public void setSehir(Sehir sehir) {
this.sehir = sehir;
}

@Override
public String toString() {
return "Ulke: " + this.ulkeAdı + " Sehir: " + this.sehir.getSehirAdı();
}
}
```
```JAVA
public class Sehir {

private String sehirAdı;

public String getSehirAdı() {
return sehirAdı;
}

public void setSehirAdı(String sehirAdı) {
this.sehirAdı = sehirAdı;
}

}

XML konfigürasyon tanımlamaları:

1
2
3
4
5
6
7
8
<bean id="beanSehir" class="dogukansahin.Sehir">
<property name="sehirAdı" value="Yozgat"/>
bean>

<bean id="beanUlke" class="dogukansahin.Ulke">
<constructor-arg value="Turkiye" />
<constructor-arg ref="beanSehir" />
bean>

Spring 4 ve sonrası sürümlerinde bağımlılıklar ilgili alanların üzerine @Autowired annotation’ı kullanılarak da enjekte işlemi gerçekleştirilebilir.

Örnek

1
2
3
4
5
6
7
8
9
10
11
public class Ulke {

@Autowired
private Sehir sehir;
@Autowired
private Kita kita;
@Autowired
private int nufus;

...
}

#9 Promise Kavramı

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×