10 Ağustos 2017 Perşembe

Spring Autowiring - Annotation ( @Autowired )

Merhaba arkadaşlar,


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