Spring Ders10 - Dependency Injection Alternatifleri | Autowiring


   Autowiring implicit (örtülü) olarak nesne bağımlılığı enjekte etmeyi sağlar. Avantajı daha az kod gerektirir. Dezavantajı kontrol programcıda değildir.

Autowiringin kullanabileceğimiz 5 modu vardır.
  • no
  • byName
  • byType
  • constructor
  • autodetect
no


 <bean id="..." class="..."></bean>
 <bean id="..." class="...." autowire="no"></bean>


   Autowiringin default modudur. Autowiring yapılmayacağı anlamını taşır.

byName


public class A{
    ...
}

public class B{
      A a;

   public void setA(A a){
      this.a=a;
   }
 
   public A getA(){
      return a;
   }
}



 <bean id="a" class="test.A"></bean>
 <bean id="b" class="test.B" autowire="byName"></bean>


Bu durumda B sınıfı içerisinde A sınıfından üretilen 'a' nesnesiyle aynı adlı bir bean .xml dosyasında varsa bu bean o nesneye enjekte edilir.

 byType


public class A{
    ...
}

public class B{
      A a;

   public void setA(A a){
      this.a=a;
   }

   public A getA(){
      return a;
   }
}



 <bean id="a1" class="test.A"></bean>
 <bean id="b" class="test.B" autowire="byType"></bean>


Bu durumda B sınıfı içerisinde A sınıfından üretilen 'a' nesnesiyle aynı tipte bir bean .xml dosyasında varsa bu bean o nesneye enjekte edilir.

 constructor


public class A{
    ...
}

public class B{
      A a;

   public B(){}

   public B(A a){
      this.a=a;
   }

   public void setA(A a){
      this.a=a;
   }

   public A getA(){
      return a;
   }
}



 <bean id="a1" class="test.A"></bean>
 <bean id="b" class="test.B" autowire="constructor"></bean>


Bu durumda B sınıfı içerisindeki constructor parametresinin tipi ile .xml dosyasındaki beanin tipi eşleşiyorsa bu bean o nesneye consturctor yardımıyla enjekte edilir.

autodetect


 <bean id="a1" class="test.A"></bean>
 <bean id="b" class="test.B" autowire="autodetect"></bean>


Bu mod dependency injectionın hangi yöntemle yapılacağına kendi karar verir. Spring 3 versionu ile kullanımdan kaldırılmıştır.

Autowiring yöntemlerinden byName baz alınarak hazırlanan program aşağıdadır.

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");

  B b=(B)context.getBean("b");
  
  
  System.out.println("B sinifi içerisindeki a nesnesinin sayi degeri : "+b.getA().getSayi());
  
 }

}

A.java
package test;

public class A {

 private int sayi;

 public A() {
  System.out.println("A nesnesi oluşturuldu.");
 }

 public int getSayi() {
  return sayi;
 }

 public void setSayi(int sayi) {
  this.sayi = sayi;
 }

}

B.java
package test;

public class B {

 private A a;

 public B() {
  System.out.println("B nesnesi oluşturuldu.");
 }

 public A getA() {
  return a;
 }

 public void setA(A a) {
  this.a = a;
 }

}

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="a" class="test.A">
  <property name="sayi" value="10" />
 </bean>

 <bean id="b" class="test.B" autowire="byName"></bean>


</beans>


spring autowiring


Yorumlar

Bu blogdaki popüler yayınlar

Java SE Ders24 - Composition (Kompozisyon)

Spring Ders20 - Aspect Oriented Programming - AspectJ Annotation Style

JSF Ders30 - Page Template (Sayfa Şablonu)