Spring – 01 – Hello Spring World

Hamd alemlerin Rabbi olan, insana bilmedigini ogreten Allah’a mahsustur.

“Ve ma tevfîkî illa billah aleyhi tevekkeltü ve ileyhi ünîb”
“…Başarım ancak Allah’tandır, O’na güvendim; O’na yöneliyorum.”
Hûd suresi /88

Yeni bir egitim yazi dizisinden herkese merhaba.
Bu yazilar boyunca Spring Framework’unun Core kismini anlamaya calisacagiz. Daha once Spring framework’unu yazmaya calistim. Bu yazilar bir nevi revizyon olacak ve elimden geldigince daha iyi anlatmaya calisacagim.

Eski yazilar icin ; Spring 3.x

Faydali olmasi dileklerimle.

Spring ? Bahar  ? Java

Spring kelimesini duyunca akliniza  bahar ask mesk sevgiliniz degil Java geliyorsa dogru yerdesiniz demektir.

Spring , Java uygulamalari (application) gelistirmek icin kullanilan lightweight framework olarak basit sekilde tanimlayabiliriz.

Spring’in cikis noktasi Expert One-on-One J2EE Design and Development kitabina dayanmaktadir
Rod Johnson kitabinda gelistirmis oldugu bu framework bugun Spring projesi olarak sekil bulmustur.

Spring ‘i kullanarak Java ile herhangi bir uygulama gelistirebiliriz , sadece bir alana ornegin Web’e ozel bir framework degildir. Zaten burada orneklerimizi yazarken hep Console Application yapacagiz. Tabi ki sektorel olarak dusundugumuzde Console Application yerine Spring MVC yapisi karsimiza bol miktar cikmaktadir. Spring MVC konusunu ilgili yazi dizisinde incelecegiz.

Bir diger nokta olarak lightweight kavrami karsimiza cikmaktadir. Lightweight kavrami Spring Framework’unde class sayisinin  az olmasi ya da az kod olmasi anlamina gelmez. Bu kavram Spring ‘in felsefesinden bahseder . Spring felsefe olarak minimal impact/ en kucuk etki ozelligi gosterir. Spring Framework ‘u kullanabilmek icin minimum duzeyde kod yazariz ve projemiz bu degisiklikten minimum duzeyde etkilenir.

Spring ‘in resmi sitesinden Main Projects gorebilirsiniz. Bizim burada inceleyecegimiz konu Spring Framework project konusu olacaktir.

Bu yazilar boyunca Spring Framework’unun Core kismini inceleyecegiz.  IOC , Dependency Injection , transaction management gibi.

Spring in amaci Enterprise Java uygulamalarini gelistirmeyi kolaylastirmaktir.
Spring , Java dunyasinda populer olan diger frameworkler’le uyumlu olarak calisir. Ornegin Hibernate gibi ya da JDBC icin abstraction layer barindirir.

Spring MVC , Spring Framework’unun bir bolumudur. Spring MVC yazilarinda ise bu kismi inceleyecegiz.

Inverting Control ya da Injecting Dependencies?

Spring Framework’u temel olarak Inversion of Control (IoC) ilkesi uzerine kurulmustur. Inversion of Control (IoC) prensibi bagimlilarin(dependencies) olusturulmasi(creation) ve yonetimini(management) kod icerisinden kaldiran/developer’dan alan bir tekniktir.

Daha iyi anlamak icin kucuk bir kod ornegi yazalim. Computer sinifimizda Keyboard sinifi tipinde bir instance variable olsun ve geleneksel olarak yapacagimiz is yapilandiricida yeni bir Keyboard objesi olusturmak olacaktir.

public class Computer {

	private Keyboard keyboard;

	public Computer() {
		keyboard = new Keyboard();
	}

}

IoC (Inversion of Control) yaklasiminda ise Keyboard objesi burada oldugu gibi kod icerisinde new anahtar kelimesiyle olusturulmaz , bunun yerine calisma zamaninda/runtime cesitli external process ile bu yeni obje olusturma islemi gerceklesir .

Ilerleyen bolumlerde bu konuyu tekrar ele alip detayli bir sekilde incelemeye calisacagiz. Burada sadece giris niteliginde anlamaya calisalim.

Dependency Injection kavrami cogu zaman IoC kavrami yerine kullanilir. Dependency Injection aslinda IoC tekniginin bir alt kumesidir , yani bir IoC teknigidir.

Dependency Injection sadece Spring icin gecerli bir teknik degildir. Ornegin Java Server Faces (JSF) @ManagedProperty annotation’ini kullanarak JSF ManagedBean’leri arasinda Dependency Injection teknigini kullanabiliriz. Boylelikle calisma zamaninda/runtime kendimiz, bagimli olan( dependency) ManagedBean objesini olusturmayiz @ManagedProperty annotation’ini kullanarak bu islemi JSF Implementation framework’une birakiriz.
Benzer sekilde CDI beanlerini kullandigimizda @Inject annotation’dan yararlaniriz.

Tabi JSF te yer alan Dependency Injection mekanizmasi Spring kadar gelismis degildir.
Spring Framwork’unun Dependency Injection mekanizmasi son derece gelismis ve esnek bir yapiya sahiptir.
Spring DI mekanizmasi 2 ana Java SE kavrami uzerine konumlandirilir ; JavaBeans ve Interface.

Code to Interface yaklasimini , Spring kavramindan bagimsiz olarak dusundugumuzde kodumuza esneklik(flexible) ozelligi saglayacaktir.

Code to Interface yaklasiminda methodlari cagirmak icin class yerine interface tipindeki degisken kullanilir. Yani bir ArrayList<String> objesi olusturalim.

List<String> codeToInterface = new ArrayList<String>();
codeToInterface.add("java");
codeToInterface.add("spring");

codeToInterface degiskenimiz List tipindedir. Java ‘ da bir referans degisken hem kendi tipinde hem de subclass tipinde bir objeyi referans edebilir.
codeToInterface degiskenimiz burada ArrayList tipinde bir objeyi gostermektedir. Benzer sekilde ArrayList objesini gosterdigi gibi LinkedList tipinde bir objeyi de gosterebilir.

codeToInterface = new LinkedList<String>();

Iste burada oldugu gibi concrete class’lari kullanmayip interface’lerden yararlanip kod yazdigimiz yaklasima Code To Interface yaklasimi adi verilir.

ArrayList badList = new ArrayList(); 

Dependency Injection teknigini kullanarak uygulamamizi interface-based yaklasimina uygun sekle getirebiliriz , ustelik bunun icin minimum kod yazmamiz yeterli olacaktir.
Dependency Injection kavramini dusundugumuzde Spring bir frameworkten daha cok bir Container ozelligi gosterir. Servlet Container’i dusundugumuzde bizim yerimize Servlet objesini olusturmaktan ve lifecycle’i yonetmekten sorumludur. Benzer sekilde Spring de Dependency Injection’i gerceklestirerek Servlet Container’in obje olusturmasi gibi bizim icin gerekli bagimliklarin(dependency) objelerini olusturur.

Dependency Injection Gelisme Sureci

Yillar gectikce Dependency Injection teknigi Java developer’lar arasinda son derece sevilen bir ozellige sahip oldu.Bunda Spring’in populerligi yadsinamaz bir gercek olsa gerek. Spring , EJB teknolojisinin zorluguna alternatif olarak gelistirilen ve sonrasinda populerligi artan bir framework olarak karsimiza cikmaktadir. Gerci EJB 3.X ile birlikte yeniden EJB nin ivme kazandigi/kazanacagi soyleniyor.

Spring , 2002 yilinda Rod Johson tarafindan gelistirilmeye baslandi , SpringSource firmasinin 2009 yilinda VMWare tarafindan satin alindi ($420m).  Sonrasinda VMWare ve baska firmalarin birlesiminden olusan Pivotal sirketi bunyesinde gelistirilmeye devam etmektedir.

Dependency Injection tekniginin populerliginin artmasiyla JCP(Java Community Process) te JSR 330: Dependency Injection for Java olarak yerini aldi. Bu spect ‘in liderligini Rod Johsonn yapmaktadir.

DI tekniginin bazi avantajlarina bakacak olursak ;

Reduced glue code (Yapisik kodlari azaltmak)
DI tekniginin en onemli ozelliginden biri olarak uygulamamizdaki yapisik kodlarin azaltilmasi oldugunu soyleyebiliriz.

Simplified application configuration (Uygulama konfigurasyonlarini basitlestirmek)
Uygulamamizi konfigure etmek DI mekanizmasi ile son derece kolaylasacaktir.

Ability to manage common dependencies in a single repository: (Bagimliliklari tek bir depo uzerinden yonetebilme)

Data source connection , transaction , remote service’ler gibi yaygin/genel/common dependency’ler tek bir depo/repository icinde yer alacaktir. (contained)

Improved testability ( test edilebilirligi gelistirmek/artirmak)
DI teknigi test edilebilirligi arttirir ve test kolayligi saglar. DI teknigi ile mock implementation’lar kullanilarak test etmemiz kolaylasacaktir.

Fostering of good application design (uygulama tasariminin iyi/kaliteli olmasini tesvik etmek/katki saglamak)
DI teknigini kullanmak uygulamamizin daha duzgun/esnek/iyi bir design’a sahip olmasini saglar.

Beyond Dependency Injection

Java 8 support

Spring 4 , Java 8 i desteklemektedir ve geriye donuk olarak JDK6 update 18’e kadar uyumlu olarak calismaktadir.

Aspect-Oriented Programming with Spring

Bir yazilim sistemi bir cok birlesenden olusmustur ve her birinin farkli sorumluluklari ve fonksiyonelligi vardir. Bu bilesenler temel fonksiyonellerine ek olarak gorevler ustlenebilirler. Transcation, Logging ,Security , Caching gibi…

Bu gibi sistem servisleri cross-cutting concern olarak bilinmektedir.

Sistemde bu servisleri anlayabilmek icin birden fazla bileseni incelemek gerekir.
Farkli bir modul olarak tanimlansalar bile cross-cutting concern ler code duplicationina neden olurlar.

cross-cutting

Spring Expression Language

JSP ve JSF bunyesinde yer alan Expression Language yapisi benzer sekilde Spring’te de yer almaktadir.
Spring Expression Language , Spring 3.0 ile gelen bir ozelliktir.

Validation in Spring

Spring , Validation icin iyi bir destek saglamaktadir.
org.springframework.validation.Validator arabirimi org.springframework.validation.ValidationUtils gibi siniflar barindirir. Bununla birlikte JSR-303 Bean Validation API ile uyumlu sekilde calisir.

Accessing Data

Spring ; JDBC , Hibernate , JDO , JPA gibi teknolojilerle son derece uyumlu sekilde calisabilmektedir. Bununla birlikte Nonrelational database’lerle de uyumlu sekilde calismaktadir.

Object /XML Mapping in Spring

Spring , marshalling (Java Object – > XML) ve unmarshalling ( XML -> Java Object) donusumlerini yapan library’ler ile uyumlu sekilde calisir.

Managing Transactions

Spring , Transaction management icin harika bir abstraction layer sunmaktadir.
Programmatic ve Declarative transaction icin cozumler sunmaktadir.

MVC in the Web tier

Spring Framework’unu farkli turlerdeki uygulamalar icin kullanabiliriz. Bununla birlikte pratikte karsimiza en cok Web tarafinda ciktigini soyleyebiliriz.
Spring , MVC patterini uygulamaktadir. Genel olarak Spring MVC kullanildiginda View tarafi JSP olmaktadir. Bununla birlikte Apache Velocity , FreeMarker , Apache Tiles gibi frameworkler icin de destek saglar.

Burada bahsettigimiz ozellikler disinda Spring’in sayisiz ozelligi ve cesitli konular icin cozumleri mevcuttur.
Bu bolumde Spring dunyasina kucuk bir merhaba dedik. Burada bahsettigimiz IoC , Dependency Injection gibi kavramlari ilerleyen bolumlerde detayli bir sekilde inceleyecegiz.

WebSocket Support

Spring 4.0 dan itibaren , Java API for WebSocket (JSR-356) ‘yi desteklemektedir.
Web Socket’ler , Client ve Server arasinda kalici bir baglanti saglar (persistent connection)
https://en.wikipedia.org/wiki/WebSocket

Remoting Support

Spring ,Remote Access mekanizmalari icin destek/support saglar.
Java Remote Method Invocation (RMI) , JAX-WS , Caucho Hessian , JMS , REST

Mail Support

Spring , standard JavaMail API icin destek saglar.

Job Scheduling Support

Scheduling , zamanlama , planlama anlamina gelmektedir.
Spring , JDK Timer API ve Quartz icin destek saglar.

Dynamic Scripting Support

Spring , Dynamic Scripting dillere destek saglar.
Groovy , JRuby , BeanShell gibi..

Alternatives to Spring

JBOSS Seam Framework

Hibernate ORM framework’unun creator’i Gaving King tarafindan olusturulmustur.
http://www.seamframework.org/

Frond-end development tarafinda JSF , business logic layer’da EJB ve persistence ‘da JPA tercih edilir. Seam Framework’u , Java EE standardlari uzerine insaa edilmistir.

Google Juice

Google Guice , JSR-330 “Dependency Injection for Java” icin reference implementation’dir.

Java EE7 Container

Yukarida bahsettigimiz gibi DI mekanizmasi populerligi nedeniyle JCP icerisinde yer almaktadir. Application Server’lar DI mekanizmasina destek saglamaktadirlar.

Github kaynak dosyalar/ source folder
leventerguder/injavawetrust-spring-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

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