Spring – Ders 3 Injection

Merhaba Arkadaslar,
Bu dersimizde basit bir sinifimiz uzerinde constructor injection ve setter injection uygulamasi yapacagiz.

Spring Setter Injection

Bir sinifta private degiskenler buludungunda bu degiskenlere ulasim public getter/setter metotlari uzerinden gerceklesir. Getter metodu degiskenin degerini almaya, Setter metodu ise degiskene deger atamak icin kullanilir.

Employee adina bir sinifimiz olacak ve 3 adet private degiskeni olacak. Bu degiskenlerin getter/set metotlari olacak.

Employee.java

package erguder.levent_03.setterInj;

public class Employee {

	private String fname;
	private String lname;
	private int salary;

	public String getFname() {
		return fname;
	}

	public void setFname(String fname) {
		this.fname = fname;
	}

	public String getLname() {
		return lname;
	}

	public void setLname(String lname) {
		this.lname = lname;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}

	public void hireEmployee() {
		System.out.println(getFname()+" "+ getLname()+" "+getSalary());
	}

}

Setter Injection uygulamamizi xml dosyamiz icerisinde yapacagiz,

tutorial_03_setterInj.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-3.0.xsd">

  <bean id="employeeBean" class="erguder.levent_03.setterInj.Employee">
	<property name="fname"   value="Levent"></property>
	<property name="lname"   value="Erguder"></property>
	<property name="salary"   value="10000"></property>  
  </bean>

</beans>

Burada dikkat ederseniz bir <property> tagi tanimladik  name alanina degiskenlerimizin adini verdik value kismina ise bu degiskene atamak istedigimiz degeri yazdik. Burada salary degiskeni integer olmasina ragmen  ” ” arasinda yazdik.
Spring 10000 degerini setSalary() metodunu cagirmadan once cevirmesi gerektigini biliyor.

Eger burada  ” ” arasinda yazmazsak su hatayi aliriz ;
Open quote is expected for attribute “{1}” associated with an  element type  “value”.
hatasini aliriz.

SetterInjectionTest.java

package erguder.levent_03.setterInj;

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

public class SetterInjectionTest {
  public static void main(String[] args) {
    ApplicationContext context = 
        new ClassPathXmlApplicationContext("tutorial_03_setterInj.xml");

    Employee employee = (Employee) context.getBean("employeeBean");
    employee.hireEmployee();
  }
}

Test sinifimizi calistiralim ve sonucu gorelim. Resimde gordugunuz gibi  xml dosyamizda verdigimiz degerleri basariyla ekrana yazdirdik. Bunun icin hireEmployee() metodundan yararlandik.

spring_ders3_setter_injection

Spring Constructor Injection

Constructor(yapilandirici) , bildiginiz uzere Javada her sinifin en az bir yapilandiricisi vardir (abstract siniflar dahil ). Setter Injection da oldugu gibi yine xml dosyamiz icerisinde constructor cagirma islemini yapabiliriz.

Basit bir kac deneme uzerinde incelememize devam edelim.

ConstructorInjection isimli bir sinifimiz olacak ve ilk asamada sadece tek bir private int degiskeni ve arguman olarak int age alan bir constructor(yapilandirici) olacaktir.

Student.java

package erguder.levent_03.consInj;

public class Student {

	private int age;

	public Student(int age) {

		this.age = age;
	}

	public void printStudent(){
		System.out.println(this.age);
	}
}

yapilandiricimizin duzenlenme islemlerini xml dosyamiz icerisinde yapacagiz.

	<bean id="studentBean" class="erguder.levent_03.consInj.Student">
		<constructor-arg value="23"></constructor-arg>
	</bean>


<constructor-arg >
tagi ve value ozelligi ile yapilandirici icin degerimizi gonderiyoruz. Burada dikkat ederseniz setter injection da oldugu gibi value den sonra cift tirnak icerisinde degerimizi yaziyoruz. Spring bizim icin bu degeri int degere donusturuyor. Eger buraya tam sayi olmayan bir deger verirsek (double bir sayi)  veya “levent” gibi integer degere donusturulemeyen bir string verirsek java.lang.NumberFormatException hatasi ile karsilasiriz.

Simdi yeni bir degisken ve yapilandirici ekleyelim.

	public Student(int age,String name) {
		this.age = age;
		this.name = name;
	}

 

	<bean id="studentBean" class="erguder.levent_03.consInj.Student">
		<constructor-arg value="23"></constructor-arg>
		<constructor-arg value="levent"></constructor-arg>
	</bean>

Olusturdugumuz yapilandiriciyi kullanmak icin burada yeni bir <constructor-arg> tagi kullandik. Simdi de yeni bir int ve String degisken ekleyelim , sinifimizin son hali..

Student.java

package erguder.levent_03.consInj;

public class Student {

	private int age;
	private String name;
	private String surname;
	private int no;

	public Student(int age) {
		this.age = age;
	}

	public Student(int age,String name) {
		this.age = age;
		this.name = name;
	}

	public Student(int age, int no) {
		this.age = age;
		this.no = no;
	}

	public Student(String name, String surname) {
		this.name = name;
		this.surname = surname;
	}

	public void printStudent(){
		System.out.println("Age:"+this.age+ " Name:" + this.name
				+" Surname:" +this.surname +" No:"+this.no);
	}
}

 

	<bean id="studentBean" class="erguder.levent_03.consInj.Student">
		<constructor-arg value="23"></constructor-arg>
		<constructor-arg value="23"></constructor-arg>
	</bean>

Iki degeri de integer bir deger yaptik. Peki iki integer deger alan yapilandirici mi calisacak ?  Test sinifimizi calistirdigimizda  ciktimiz su sekilde olacaktir.

 Age:0 Name:23 Surname:23 No:0

Gordugunuz gibi iki String arguman alan yapilandirici calisti , name ve surname degiskenleri set edildi . ( instance variable , integer icin default degeri 0 dir, objeler icin null dir.)
Bu durumun ustesinden gelmek icin su yolu izleyebiliriz.

	<bean id="studentBean" class="erguder.levent_03.consInj.Student">
		<constructor-arg type="int" value="23"></constructor-arg>
		<constructor-arg type="int" value="23"></constructor-arg>					 
	</bean>


<constructor-arg>
tagimiz icerisinde type ozelligi yardimi ile degiskenimizin turunu ozellikle belirtebiliriz. Burada iki degiskenimizin de int oldugunu belirttik ve Spring in ona gore davranmasini soyledik.

Tekrar calistirip sonucu gorelim,

Age:23 Name:null Surname:null No:23

Gordugunuz gibi age ve no degiskenlerine deger atandi. name ve surname degiskenlerine deger atanmadigi icin null olarak kaldilar.

Simdi de <constructor-arg> icin ref ozelligini kullanalim bu konuda bir ornek yapalim.

IFace.java

package erguder.levent_03.consInj2;

public interface IFace {
	void method1();
}

Bir interface tanimladik ve bu interface i implements eden bir B sinifi..

B.java

package erguder.levent_03.consInj2;

public class B implements IFace{

	@Override
	public void method1() {
		System.out.println("method1- class B");
	}

}

A sinifimizda IFace arabiriminin referans degiskeni bulunmaktadir. Yapilandiriciya da dikkat edelim.

A.java

package erguder.levent_03.consInj2;

public class A {

	private IFace iface;
	private int var1;

	public A(int var1, IFace iface) {
		this.var1 = var1;
		this.iface= iface;
	}

	public void printA() {
		System.out.println(var1);
		iface.method1();
	}

}

A sinifinin yapilandiricisi int ve IFace turunden 2 arguman almaktadir.

tutorial_03_cons2.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-3.0.xsd">

	<bean id="beanB" class="erguder.levent_03.consInj2.B">	
	</bean>

	<bean id="beanA" class="erguder.levent_03.consInj2.A">	
		<constructor-arg value="con inj"></constructor-arg>
		<constructor-arg ref="beanB"></constructor-arg>
	</bean>

</beans>

Burada 2 adet bean tanimladik, B sinifi icin ve A sinifi icin.
<constructor-arg> da bir onceki ornegimizde oldugu gibi direkt olarak value ozelligi ile degeri verdik. Bununla birlikte value ozelligini kullanarak bir bean’ i veremeyiz.
Bu durumu ref ozelligi ile cozebiliriz, ref ozelligine verdigimiz bean id ile, yapilandiriciya verdigimiz argumanin beanB referansi oldugunu belirtiriz.

Son olarak burada B sinifi IFace arabirimini implements ettigi icin, her B objesi IFace turundendir. 

Test ettigimizde su ciktiyi aliriz.

15
method1- class B

Bu dersimiz de burada son buluyor.

Kaynak Kodlar  : SpringProject_v3

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *