Bu yazımda daha önce Spring Autowiring-XML yazımda bahsettiğimden farklı olarka autowiring işlemini annotation üzerinden nasıl yapılacağına değineceğim.
Annotation ile autowiring işlemi için @Autowired annotation'ı kullanılır.
Bir bean ile autowiring yapabilmek için @Autowired annotation'ı setter metod, constructor veya bir nesnede kullanılmalıdır.
Aşağıdaki örnekleri inceleyelim.
Öncelikle bean'leri oluşturuyoruz.
public class Ogrenci {
private String ogrenciad;
private String ogrencisoyad;
private String numara;
private String okulad;
public String getOgrenciad() {
return ogrenciad;
}
public void setOgrenciad(String ogrenciad) {
this.ogrenciad = ogrenciad;
}
public String getOgrencisoyad() {
return ogrencisoyad;
}
public void setOgrencisoyad(String ogrencisoyad) {
this.ogrencisoyad = ogrencisoyad;
}
public String getNumara() {
return numara;
}
public void setNumara(String numara) {
this.numara = numara;
}
public String getOkulad() {
return okulad;
}
public void setOkulad(String okulad) {
this.okulad = okulad;
}
}
package com.serdarkocerr.SpringExample; public class Ders { /**/ private Ogrenci ogrenci; private String dersad; public String getDersad() { return dersad; } public void setDersad(String dersad) { this.dersad = dersad; } }
Class'ları oluşturduktan sonra bunları Spring-Module.xml içerisinde bean olarak tanıtıyoruz.
Spring-Module.xml
<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-2.5.xsd">
<bean id="ogr" class="com.serdarkocerr.SpringExample.Ogrenci">
<property name="ogrenciad" value="Serdar" />
<property name="ogrencisoyad" value="Kocer" />
<property name="numara" value="821" />
<property name="okulad" value="Arifiye AOL" />
</bean>
<bean id="ders" class="com.serdarkocerr.SpringExample.Ders" >
<property name="dersad" value="Matematik" />
</bean>
</beans>
Bu haliyle id="ders" olan bean'den bir nesne oluşturmaya çalışırsak Ders içerisinde bulunan Ogrenci ogrenci nesnesine herhangi bir autowiring (injection )yapılmadığından
org.springframework.beans.factory.BeanCreationException:
hatasını alırız.
Autowiring işlemine geçmeden önce Annotation ile autowiring yapacağımızı Spring-Module.xml içerisinde belirtmemiz gerekmektedir.
<context:annotation-config />
Spring-Module.xml
<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-2.5.xsd"> <context:annotation-config /> <bean id="ogr" class="com.serdarkocerr.SpringExample.Ogrenci"> <property name="ogrenciad" value="Serdar" /> <property name="ogrencisoyad" value="Kocer" /> <property name="numara" value="821" /> <property name="okulad" value="Arifiye AOL" /> </bean> <bean id="ders" class="com.serdarkocerr.SpringExample.Ders" > <property name="dersad" value="Matematik" /> </bean> </beans>Ayrıca Maven projesi kullanıyorsanız pom.xml'e aşağıdaki dependency'leri eklemelisiniz.
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
Autowiring Uygulamaları:
Spring-Module.xml'i bu şekilde annotation autowiring yapabilecek şekle getirdikten sonra autowiring işlemlerine geçebiliriz.
Ogrenci class'ı yukarıdaki gibi olmalıdır. Bu kısımda @Autowired annotation'ı autowire işlemi olacak kısma eklenir yani Ders class'ı içine.
Annotation ile 3 şekilde autowiring yapabilir. Aşağıda örneklerle açıklanmıştır.
1. @Autowired Setter metod
package com.serdarkocerr.SpringExample; import org.springframework.beans.factory.annotation.Autowired; public class Ders { /*AutoWiring Ozelligi XM@annotation ile*/ private Ogrenci ogrenci; private String dersad; public Ogrenci getOgrenci() { return ogrenci; } @Autowired public void setOgrenci(Ogrenci ogrenci) { this.ogrenci = ogrenci; } public String getDersad() { return dersad; } public void setDersad(String dersad) { this.dersad = dersad; } }
Kırmızı bold alanlara dikkat et!
Yukarıdaki class'a bakıldığında bir nesne olarak tanıtılmıs ogreci değişkeninin setter metodunun üstüne @Autowired annotation'ı eklenmiş.
@Autowired annotation'ı Spring-Module.xml içerisinde ilgili bean'ı buluyor. ( Class ismine göre buluyor sanki byType gibi.) Bulduğu bean ile autowiring işlemi uyguluyor.
2. @Autowired Constructor
package com.serdarkocerr.SpringExample; import org.springframework.beans.factory.annotation.Autowired; public class Ders { /*AutoWiring Ozelligi @Annotation ile*/ private Ogrenci ogrenci; private String dersad; public Ogrenci getOgrenci() { return ogrenci; } @Autowired public Ders(Ogrenci ogrenci) { super(); this.ogrenci = ogrenci; } public String getDersad() { return dersad; } public void setDersad(String dersad) { this.dersad = dersad; } }
Yukarıdaki kod incelendiğinde @Autowired işlemi constructor'ın üstüne tanımlanmış Constructor ise bir nesne tipinde tanımlanmış değişkeni içinde set ediyor yani setter gibi işlem görüyor. Spring-Module.xml dosyasında @Autowired yapılan nesnenin class ismi ( Ogrenci class'ı ) aranıp autowiring işlemi uygulanıyor.
3. @Autowired Değişken
package com.serdarkocerr.SpringExample; import org.springframework.beans.factory.annotation.Autowired; public class Ders { /*AutoWiring Ozelligi @Annotation ile */ @Autowired private Ogrenci ogrenci; private String dersad; public Ogrenci getOgrenci() { return ogrenci; } public String getDersad() { return dersad; } public void setDersad(String dersad) { this.dersad = dersad; } }
Yukarıdaki örneği incelersek, Ogrenci tipinde oluşturulan nesneye @Autowired annotation'ı ile autowiring işlemi uygulanmış.
Spirng-Module.xml dosyasında bu nesne tipindeki bean bulunacak ve autowiring işlemi uygulanacak.
@Qualifier Annotation
Bu annotation bize iki tane aynı class isimine sahip fakat id'leri birbirinden farklı ( bean id'leri her zaman uniqe olmalıdır.) bean var ise @Autowired annotation'ı kullanıldığında hangi bean'i seçeceğini belirtir. @Autowired annotation'ı autowiring işlemini class ismine göre yaptığından ve aynı isimde iki class birden olduğundan bunlar arasında ayrım yapamaz. Ek olarak bir bilgi daha gerekmektedir. Bu bilgi ise @Qualifier Annotation'ı ile sağlanır.
Spring-Module.xml
<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-2.5.xsd"> <context:annotation-config /> <bean id="ogr1" class="com.serdarkocerr.SpringExample.Ogrenci"> <property name="ogrenciad" value="Serdar" /> <property name="ogrencisoyad" value="Kocer" /> <property name="numara" value="821" /> <property name="okulad" value="Arifiye AOL" /> </bean> <bean id="ogr2" class="com.serdarkocerr.SpringExample.Ogrenci"> <property name="ogrenciad" value="Hakan" /> <property name="ogrencisoyad" value="Kocer" /> <property name="numara" value="10" /> <property name="okulad" value="Kocaeli AOL" /> </bean> <bean id="ders" class="com.serdarkocerr.SpringExample.Ders" > <property name="dersad" value="Matematik" /> </bean> </beans>
package com.serdarkocerr.SpringExample; import org.springframework.beans.factory.annotation.Autowired; public class Ders { /*AutoWiring Ozelligi @Annotation ile */ @Autowired @Qualifier("ogr2") private Ogrenci ogrenci; private String dersad; public Ogrenci getOgrenci() { return ogrenci; } public String getDersad() { return dersad; } public void setDersad(String dersad) { this.dersad = dersad; } }
Yukarıdaki örneğer dikkat edersek Spring-Module.xml içerisinde
com.serdarkocerr.SpringExample.Ogrenci
class'ından iki tane bean tanımlanmış.Ders class'ında tanımlanan Ogrenci tipindeki nesnenin @Autowired ile hangi bean'e autowiring olacağını ek olarak söylememiz gerekmektedir. Çünkü @Autowired annotation'ı autowiring işlemini xml içinde belirlenen beanlerin class ismine göre yapmaktadır. Bu sebepten Ders class'ı içinde
@Qualifier("ogr2")
@Qualifier annotation'ı ile id="ogr2" olan bean'ı autowiring edecektir. Yani output olarak;
Hakan
Kocer
100
Izmit AOL
Matematik
çıktısı alınacaktır.
Kaynaklar:
https://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/
Hiç yorum yok:
Yorum Gönder