Spring – Ders 1 Baslangic ve Kurulum

Merhaba Arkadaslar ,
Bu derslerimiz de Hibernate dersleri tarzinda olacak her ders mumkun oldugunca ornek bir uygulama yapacagim.Daha sonrasinda Hibernate+Spring birlesimi bir uygulama yapmak istiyorum. Bu surecte ben de ogrenmeye devam edecegim kapsamli bir uygulama yapmayi hedefliyorum ­čÖé

Spring bir open source frameworktur, Rod Johson tarafindan gelistirilmistir.Spring in ana misyonu┬á“Spring simplifies Java Developtment”

Spring Framework u bir Java projesine;

  • Lightweight ve POJOlar sayesinde (plain old java object) minimum duzeyde karisiklik.
  • Dependency Injection ve Interface Orientation ile Loose Coupling ozelliginin saglanmasi.
  • Spring kodunuzun karismasindan kacinir, cok fazla Spring-Specific bir interface(arabirim) i implements etmenizi veya Spring-Specific bir class(sinif) i extend etmenizi istemez.
  • Basitlik, test kolayliligi gibi ozellikler saglar.

Spring uygulamalarimizi Eclipse IDE ile gelistirecegiz. Bu dersimizde kurulum ve ilk ornegimizle baslayacagiz.Benim illa her ornegin hangi jarlari kullandigini ogrenmek , elle manuel yapmak gibi bir aliskanligim var  bu nedenle oncelikle hangi jarlar gerekli nasil kurariz bundan bahsetmek gerek.

JDK ve Eclipse Junonun bilgisayarda kurulu oldugunu varsayiyorum ve gerekli jarlari┬áspring jar┬ádan indirelim. 3.2.1 versionu suan en son surumu , ilerleyen zamanlarda diger versionlari cikacaktir ve muhtemelen uyumlu olacaktir ­čÖé

Gerekli spring jarlarindan sonra indirmemiz gereken bir jar grubu daha var commons-logging jar . Spring uygulamamizin calismasi icin bu jarlar da gerek.

Eclipste, Java Project aciyoruz,  projemize indirdigimiz jarlari ekliyoruz ya da burada User Library olusturdum ve jarlari icine ekledim hem spring hem commons-logging jari, baska bir uygulama yaptigimizda tek tek jarlarla ugrasmak yerine kutuphaneyi eklemek daha kolay olacaktir.

Java Build Path —> Add Library –> User Library ..

spring01_01

ilk ornegimizde 3 adet package olacaktir ,
ilk paketimizi olusturalim siz dilediginiz isimde olusturabilirsiniz  tabiki
—- >┬áerguder.levent_01.coupled

Paketi olusturduktan sonra Mecnun ve Leyla isimli iki sinif olusturalim ­čÖé coupled kelimesi aklima Leyla ve Mecnunu cagrisim yaptigi icin bu isimleri kullanmak istedim ­čÖé

Coupled Durumu

Mecnun sinifimizda Leyla turunde bir degisken bulunmaktadir.
Mecnun sinifimizin Constructor in da (yapilandirici) leyla objesi olusturulmaktadir.
collereDus() metodumuz icerisinde Leyla sinifimizda bulunan vefaGosterme metodu cagrilmaktadir.

Mecnun.java

 
package erguder.levent_01.coupled;

public class Mecnun {

	private Leyla leyla;

	public Mecnun() {
		leyla = new Leyla();
	}

	public void collereDus() {
		leyla.vefaGosterme();
	}
}

Leyla.java

 
package erguder.levent_01.coupled;

public class Leyla {
	   public void vefaGosterme() {
	        System.out.println("- Ey ├ó┼č─▒k! Neyin varsa getir! \n"+
"- A ay y├╝zl├╝! Senin a┼čk─▒nla ne suyum kald─▒, ne kuyum.\n" +
"Ne ci─čerimde az─▒c─▒k kan, ne geceleri g├Âz├╝mde uyku.\n" +
"A┼čk─▒n akl─▒m─▒ ya─čmalad─▒ktan sonra her ┼čeyim birer birer gitti.\n" +
"┼×imdi sahip oldu─čum tek ┼čey yaral─▒ bir ku┼č olan can─▒m.\n" +
"Senden bir emir bekliyorum. Ver dersen hemencecik vereyim. \n" +
"Leyla g├╝ld├╝ bu sohbete. Sonra sitem etti:\n" +
"- A yi─čit! Ben senden bunu ne vakit istersem al─▒r─▒m, ba┼čka neyin var?! \n" +
"Iskender Pala");
	    }
}

MecnunTest.java

package erguder.levent_01.coupled;

public class MecnunTest {

	public static void main(String[] args) {

		Mecnun mecnun = new Mecnun();
		mecnun.collereDus();
	}
}

Mecnun ile Leyla arasinda “leyla” sinif degiskeni uzerinden bagimlilik┬ávardir. (tightly coupled) Mecnun, Leyla olmadan gorevini yerine getiremeyecektir.
Eger leyla objesini olusturmazsak NullPointerException aliriz.

Buyuk capta projeler goz onunde bulundurulduguda Coupled durumu ile bas etmek gercekten problem olacaktir. Coupling durumu test edilebilirligi, tekrar kullanilabilirligi ve anlasilabilirligi azaltacaktir.

MecnunTest.java

package erguder.levent_01.coupled;

public class MecnunTest {

	public static void main(String[] args) {

		Mecnun mecnun = new Mecnun();
		mecnun.collereDus();
	}
}

spring_01_02

MecnunTest sinifimizi calistirdigimizda yukaridaki ciktiyi aldik.

De-Coupled Durumu (Baglasimi Kopartmak)

Buyuyen projelerde coupling(baglasim) dan dogacak problemlerden kurtulmak icin nesnelerin aralarindaki  iliskiler bagimsiz hale getirilimelidir. Bu isleme de-coupling denilir.Bu islemi yaparken bir arabirimden faydalanacagiz.

yeni bir paket olusturalim, —>┬áerguder.levent_01.decoupled

Masuk.java

package erguder.levent_01.decoupled;

public interface Masuk {
	public void vefaGosterme();
}

Bu arabirimi Leyla ve Sirin siniflarimiz uygulasin.

Leyla.java

package erguder.levent_01.coupled;

public class Leyla {
	   public void vefaGosterme() {
	        System.out.println("- Ey ├ó┼č─▒k! Neyin varsa getir! \n"+
"- A ay y├╝zl├╝! Senin a┼čk─▒nla ne suyum kald─▒, ne kuyum.\n" +
"Ne ci─čerimde az─▒c─▒k kan, ne geceleri g├Âz├╝mde uyku.\n" +
"A┼čk─▒n akl─▒m─▒ ya─čmalad─▒ktan sonra her ┼čeyim birer birer gitti.\n" +
"┼×imdi sahip oldu─čum tek ┼čey yaral─▒ bir ku┼č olan can─▒m.\n" +
"Senden bir emir bekliyorum. Ver dersen hemencecik vereyim. \n" +
"Leyla g├╝ld├╝ bu sohbete. Sonra sitem etti:\n" +
"- A yi─čit! Ben senden bunu ne vakit istersem al─▒r─▒m, ba┼čka neyin var?! \n" +
"Iskender Pala");
	    }
}

Sirin.java

 
package erguder.levent_01.decoupled;

public class Sirin implements Masuk {

	@Override
	public void vefaGosterme() {
		System.out.println("Daglar delinmedi mi hala ?");

	}

}

Mecnun.java

 
package erguder.levent_01.decoupled;

public class Mecnun {

	Masuk masuk;

	public Mecnun(Masuk masuk) {
		this.masuk=masuk;
	}

	public void collereDus() {
		masuk.vefaGosterme();
	}
}

Mecnun sinifimiza dikkat ederseniz Masuk turunden bir degisken bulunmaktadir. Yapilandiricimiz masuk turunden bir arguman almaktadir. Bu argumani sinif degiskenine atamaktayiz. Yapilandirici gelen Masuk degiskeninin turunu bilmemektedir. Yani Leyla sinifinin objesi ve ya Sirin sinifinin objesi olabilir. Bir arabirim yardimi ile siniflar arasindaki baglasimi kopartmis olduk.

MecnunTest.java

package erguder.levent_01.decoupled;

public class MecnunTest {
    public static void main(String[] args) {
        Leyla leyla=new Leyla();    
        Sirin sirin=new Sirin();

        Mecnun mecnun=new Mecnun(leyla);
        mecnun.collereDus();
    }

}

MecnunTest sinifimizda Leyla turunden bir obje olusturduk ve Mecnun turunde bir obje olustururken leyla objesini gonderdik.
Sirin sinifindan bir obje olusturup kolayca bu islemi sirin objesi icin gerceklestirebiliriz.
leyla objesi yerine sirin objesini vererek sonucu gorebilirsiniz.

spring_01_03

Spring Uygulamasi

Artik Spring uygulamamiza giris yapabiliriz, bunun icin tekrar bir package olusturalim.—>┬áerguder.levent_01.spring

Burada kullanacagimiz siniflar da ayni olacak sadece Test sinifimizin yapisi farkli olacak.

Mecnun sinifimizda

public Mecnun(Masuk masuk) {
this.masuk = masuk;
}

yapilandiricisina dikkat edecek olursak Spring ile bu noktada Dependency Injection islemini uygulayacagiz. Ilk coupled ornegimizde burada new anahtar kelimesini kullanmistik ve kendi objemizi yapilandirici icerisinde olusturmustuk.Construction Time da Dependency Injection yaklasimi ile bu sorunu Spring in halletmesini saglayacagiz. Buna constructor injection denir.

MecnunTest.java

package erguder.levent_01.spring;

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

public class MecnunTest {
	public static void main(String[] args) {
		ApplicationContext appContext = new ClassPathXmlApplicationContext(
				"tutorial_01.xml");

		//Mecnun mecnun = appContext.getBean("mecnunId", Mecnun.class);
		Mecnun mecnun = (Mecnun) appContext.getBean("mecnunId");
		mecnun.collereDus();

	}
}

ApplicationContext bean tanimlamasini yukler ve birbirine baglar. ApplicationContext objelerin birbirine baglanmasi ve olusturulmasindan sorumludur.Spring birden fazla application context implamasyonu sunar. Bunlarin arasindaki fark , konfigurasyonu nasil yaptiklaridir.

Konfigurasyonumuzu tutorial_01.xml dosyamizda yapacagiz. Bu nedenle ClassPathXmlApplicationContext bunun icin uygun olacaktir.
Dosyamizin adini appContext objemizi olusturken verdik.

mecnun objemizi olustururken  2 farkli sekilde de olusturulabilir. 2.sinde gelen obje Mecnun turune cast edilmektedir. 1.sinde Mecnun.class ile bir instance parametre gonderilmektedir.

 tutorial.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="mecnunId" class="erguder.levent_01.spring.Mecnun">
    <constructor-arg ref="leylaId" />    
  </bean>

  <bean id="leylaId"
        class="erguder.levent_01.spring.Leyla" />

</beans>

1)Her sinifi bir┬ábean┬áolarak dusunebiliriz. bean Id ┬áolarak mecnun id yi verdik dikkat ederseniz MecnunTest.java sinifinda getBean metoduna parametre olarak da mecnunId yi vermistik, bu tesaduf degil ­čÖé
2) class property si degeri icin, erguder.levent_01.spring.Mecnun dedik, burada Mecnun sinifinin tam adresini yazmamiz gerekmekte.
3)Yaptigimiz islemin constructor injection oldugunu belirtmistik, burada constructor-arg a ref property ile leylaId yi veriyoruz.
4)Yeni bir bean tanimlamasini Leyla sinifi icin yapiyoruz , yine id olarak leylaId ve tam path tanimlamasini yaziyoruz.

MecnunTest sinifimizi calistiralim ve sonucu gorelim..

spring_01_05

Seherde b├ó─ča geldi seyre c├ón├ón
Neler seyr eyledi bîdâr olanlar

ve mutlu son…
Bu yazimizi da burada noktalalayalim.

kaynak kodlar: SpringProject_v1

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

 

Print Friendly, PDF & Email

Leave a Reply

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