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>
Yorumlar
Yorum Gönder