Spring Ders05 - Dependency Injection


   Dependency Injenction ( Bağımlılık Enjektesi ) bağımlılıkları dışarıdan vererek sıkı bağımlı programlar yerine gevşek bağımlı programlar yazabilmeyi amaçlar.

Sıkı bağımlı programlarda sınıfların içinde new anahtar kelimesi kullanılarak yeni bir nesne oluşturulur. Oluşturulan nesne o sınıfa bağımlıdır.

Gevşek bağımlı programlarda ise sınıflara dışardan bir nesne enjekte edilir. Böylece o sınıf ve sınıfın içerisine enjekte edilen nesne arasındaki bağ gevşek olmuş olur.

Gevşek bağlı programlardaki nesnelerin güncellenmesi daha kolaydır.

Sıkı bağımlı program

...
public void personelOlustur(){
  p=new Personel();
}
...


Gevşek bağımlı program ( Dependency Injection ) 

...
public void setPersonel(Personel p){
  this.p=p;
}
...


Dependency Injection
  • Setter metoduyla
  • Constructor metoduyla
yapılabilir.

Şimdi bunları içeren bir örnek yapalım.

Main.java
package test;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {
  
  
  ApplicationContext context= 
    new ClassPathXmlApplicationContext("applicationContext.xml");
  
  Personel p1=(Personel) context.getBean("pers1");
  p1.yazdir();

 }

}

Personel.java
package test;


public class Personel {

 private String ad;
 private int yas;
 private Araba araba;
 
 public Personel() {
 }

 public Personel(String ad, int yas) {
  this.ad = ad;
  this.yas = yas;
 }

 public String getAd() {
  return ad;
 }

 public void setAd(String ad) {
  this.ad = ad;
 }

 public int getYas() {
  return yas;
 }

 public void setYas(int yas) {
  this.yas = yas;
 }

 public void yazdir() {
  System.out.println("PERSONEL\n" 
    + "ad\t:\t" + ad 
    + "\nyas\t:\t"+yas
    +"\n\nAraba\n"
    +"marka\t:\t"+araba.getMarka()
    +"\nseri\t:\t"+araba.getSeri()+"\n");
 }

 public Araba getAraba() {
  return araba;
 }

 public void setAraba(Araba araba) {
  this.araba = araba;
 }
}

Araba.java
package test;

public class Araba {

 private String marka;
 private String seri;

 public Araba() {
 }

 public Araba(String marka, String seri) {
  this.marka = marka;
  this.seri = seri;
 }

 public String getMarka() {
  return marka;
 }

 public void setMarka(String marka) {
  this.marka = marka;
 }

 public String getSeri() {
  return seri;
 }

 public void setSeri(String seri) {
  this.seri = seri;
 }

}

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 
 <bean id="pers1" class="test.Personel">
  <property name="ad" value="enes"/>
  <property name="yas" value="25" />
  <property name="araba" ref="araba1"/>
 </bean>
 
 <bean id="araba1" class="test.Araba">
  <property name="marka" value="vw"/>
  <property name="seri" value="golf"/>
 </bean>



</beans>

Görüldüğü üzere araba1 beani pers1 beanine referans olarak verilmiştir. Dolayısıyla araba1 üzerindeki yapılacak değişiklikler aynen Personel sınıfındaki araba nesnesine yansıyacaktır. Ayrıca Personel sınıfındaki araba nesnesi üzerinde yapılacak değişiklikler de araba1 beanine yansıyacaktır.

spring Dependency Injection


Yukarıdaki örnek setter metodu yardımıyla depedency injectiona örnekti. Eğer bunu constructor yardımıyla yapmak isteseydik aşağıdaki şekilde düzenlememiz yeterli olacaktır.

Personel sınıfına Araba nesnesi için bir constructor eklenecek.

...
public Personel(Araba araba){
   this.araba=araba;
}
....


applicationContext.xml sınıfında property yerine constructor tagı kullanılacak.
... 
<bean id="pers1" class="test.Personel">
  <property name="ad" value="enes"/>
  <property name="yas" value="25" />
  <constructor-arg ref="araba1"/>
</bean>
...

Bu da constructor kullanarak dependency injection şekliydi.




Yorumlar

Bu blogdaki popüler yayınlar

JSP Ders04 - JSP Direktifleri

SQL Ders27 - INSERT INTO

SQL Ders43 - CONSTRAINTS | INDEX