Kategori arşivi: Spring

Spring Çatısının Yazılım Geliştirme Filozofisi

Özellikle nesneye yönelik programlama teknikleri kullanıldığında, nesneler arasında var alan bağımlılıklar çok karmaşık bir yapının oluşmasına neden olabilmektedir. Uygulama geliştirme esnasında bağımlılıkların kontrol altına alınmasına dair bir çalışma yapılmadığı taktirde, yazılımcının verimliliği ve uygulamanın kod kalitesi düşecektir. Kaliteyi artırmanın ve yazılımcının daha verimli olmasını sağlamanın bir yöntemi, tüm bağımlılıkların ve oluşan karmaşık yapının dış bir uygulama çatışı (framework) tarafından yönetilmesini sağlamak olabilir. Bu bağımlılıkların uygulama tarafından değil, kullanılan uygulama çatışı tarafından yönetilmesi anlamana gelmektir. Bu yazılım filozofisine kontrolün tersine çevrilmesi ya da Inversion of Control (IoC) ismi verilmektedir. Spring çatısının var oluşu ve çalışma prensipleri bu filozofiye dayanmaktadır.

Dependency Injection

Java gibi nesneye yönelik bir programlama dili ile geliştirilen uygulamalar ideal şartlarda kodun tekrar kullanıldığı modüler bir yapıdadır. Modüller birbirlerini kullanarak, yapmaları gereken işlemleri gerçekleştirirler. Bu modüller arası bağımlılıkların oluşmasını sağlar.

[source language=”java”]
class RentalController {
private RentalService service = new RentalServiceImpl();
}
[/source]

Yukarıda yer alan RentalController sınıfı/modülü bunun güzel bir örneğini teşkil etmektedir. RentalController sınıfı RentalService interface sınıfına bağımlıdır. Böyle bir bağımlılık modüler bir yapının oluşturulması ve kodun tekrar kullanımını sağlamak açısından zaruridir. Lakin RentalController bünyesinde somut bir implementasyon sınıfı olan RentalServiceImpl sınıfından new operatörü ile yeni bir nesne oluşturulması, mevcut bağımlılığın değiştirilemez ve tek bir tipte olması gerektiği anlamına gelmektedir. Bağımlılığı yeniden yapılandırabilmek için kodu değiştirmek ve yeniden derlemek gerekmektedir. Bağımlılıklarını kendisi yöneten bir uygulamada kod kalitesini düşüren bu tür bağımlılıkların oluşturulmasıdır. Oysaki bağımlılıkların tersine çevrilmesi prensibine (DIP; Dependendy Inversion Principle) göre bağımlığın yönü somut değil, soyut sınıflara doğru olmalıdır.

[source language=”java”]
class RentalController {
private RentalService service = rentalServiceFactory.instance();
}
[/source]

Somut bir sınıfa olan bağımlılığı yok etmek için rentalServiceFactory gibi bir fabrika (factory) sınıfından faydalanabiliriz. Fabrika tasarım şablonunu simgeleyen rentalServiceFactory bünyesinde hangi somut RentalService implementasyonunun kullanıldığını gizlemekte ve RentalController sınıfını bahsettiğim somut bağımlılıktan kurtarmaktadır. Lakin buradaki sorun rentalServiceFactory nesnesine olan bağımlılıktır. Bu nesnenin de bir şekilde new operatörü ile oluşturulması gerekmektedir.

[source language=”java”]
class RentalController {

private RentalService service;

public void setService(RentalService service){
this.service = service;
}
}
[/source]

Bağımlılıkları oluşturma işlemi ile hiç uğraşmasak, bunu başka birisi bizim için yapsa nasıl olurdu? Yukarıda yer alan kod örneğinde service değişkenine gerekli değer setService() metodu aracılığı atanmaktadır. Biran için setService() metodunun dış bir mekanizma tarafından koşturulduğunu düşünelim. Bu mekanizma setService() metodunu kullanarak herhangi bir RentalService implementasyonunu RentalController sınıfına enjekte edebilir. Bu işleme bağımlılıkların enjekte edilmesi yani dependency injection (DI) ismi verilmektedir. Bu işlemi yapan da Spring çatışıdır.

Aşağıda tipik bir Spring XML konfigürasyon örneği yer almaktadır. Yönetimi Spring’e devredilen bağımlılıklar için bu tarz konfigürasyon dosyaları oluşturulur. Spring bu konfigürayon dosyalarını kullanarak nesnelere arası gerekli bağımlılıkları oluşturur, yani bağımlılıkları enjekte eder.

[source language=”xml”]

Tek sorumluluk prensibi açışından bakıldığında da bu bir gerekliliktir.

Hollywood Prensibi

VIP (Very Important Person) olan şahıslara erişmek zordur. Onlar genelde “bizi aramayın, biz sizi ararız” şeklinde iletişimi tercih ederler. Holywood prensibi olarak bilinen bu prensibi IoC konseptini açıklamak için kullanabiliriz.

Bağımlılıkların enjekte edilmesi Hollywood prensibine göre çalışmaktadır. RentalController sınıfı kendi başına bir konstrüktör ya da fabrika metodu koşturarak bir service nesnesi edinmeye çalışmaz. Bunu yapsaydı eğer, o zaman bu VIP şahsı telefonda aramak ve benim service nesnesine ihtiyacım var demek gibi bir şey olurdu. Bunun yerine VIP şahıs, yani Spring RentalController sınıfında yer alan setService() metodunu kullanarak RentalController sınıfıyla iletişime geçmektedir. Spring RentalController sınıfına bir RentalService nesnesi enjekte edebilmek için setService() metodunu koşturmaktadır. Spring sınıfların set() metotlarını ya da konstrüktörlerini kullanarak gerek duyulan bağımlılıkları enjekte etmektedir. Bağımlılığı enjekte edebilmek için bu metotları koşturması, yani sınıfı araması gerekmektedir.

Spring koşturulacak metodun seçiminde konstrüktör ya da set() metoduyla sınırlı değildir. Hollywood prensibi sınıf bünyesinde yer alan sınıf metotları üzerinde de kullanılabilir. Bu Spring’in konfigürasyon dosyasında belirlenen herhangi bir sınıf metodunu koşturulabileceği anlamına gelmektedir. Kitabın on yedinci bölümünde inceleyeceğimiz Spring Task ve Scheduling modülünde herhangi bir POJO (Plain Old Java Object) sınıfın herhangi bir metodunu şu şekilde koşturmak mümkündür:

[source language=”xml”]

[/source]

Spring tarafından koşturulması gereken metodun ismi method element özelliğinde yer almaktadır. Görüldüğü gibi rentalDownloader nesnesi görevini yerine getirmek için hangi metodun koşturulması gerektiğini bilme sorumluluğundan arındırılmaktadır. Sadece konfigürasyon dosyası üzerinde değişiklik yaparak, POJO sınıfın çalışma tarzı adapte edilebilmektedir. Spring birçok modülünde bu mekanizmadan faydalanmaktadır.


EOF (End Of Fun)
Özcan Acar

Pratik Spring isimli kitabımdan alıntıdır.

Yeni Kitabım Pratik Spring

Bir sene süren çalışmalarım ardından Pratik Spring isimli yeni kitabımı tamamladım. Yeni kitabım Pratik Programcı Yayınları tarafından e-kitap olarak PDF formatında satışa sunuldu.

Kitap 18 bölümden oluşuyor. Ana bölüm başlıkları şunlar:

  • 1.Bölüm – Spring Nedir?
  • 2.Bölüm – Spring İle Tanışalım
  • 3.Bölüm – Spring İle Nesne Yaşam Döngüsü Yönetimi
  • 4.Bölüm – Konfigürasyon Yönetimi
  • 5.Bölüm – Spring İle Veri Tabanı İşlemleri
  • 6.Bölüm – Spring İle Transaksiyon Yönetimi
  • 7.Bölüm – Spring İle Hibernate Kullanımı
  • 8.Bölüm – Spring İle JPA Kullanımı
  • 9.Bölüm – Spring İle Aspect Oriented Programming
  • 10.Bölüm – Spring MVC
  • 11.Bölüm – Spring Security
  • 12.Bölüm – Spring REST
  • 13.Bölüm – Spring Remoting
  • 14.Bölüm – Spring Web Service
  • 15.Bölüm – Spring Testing
  • 16.Bölüm – Spring JMX
  • 17.Bölüm – Spring Task ve Scheduling
  • 18.Bölüm – Spring E-Mail

Tüm içerik başlıklarını görmek için aşağıda yer alan linke tıklayınız.

Kitabın birinci ve ikinci bölümlerini aşağıdaki linklerden edinebilirsiniz.

  Pratik Spring 1. Bölüm (282,3 KiB, 10.693 yükleme)

  Pratik Spring 2. Bölüm (452,8 KiB, 7.619 yükleme)

Spring Core Sertifika Sınavı Ardından

Geçen sene katıldığım Spring Integration ve Spring Core kurslarının ardından bu senenin mayıs ayında Spring Integration sertifikasını  almıştım. Katıldığım kurslardan sonra aklımda Pratik Spring Core kitabını yazma fikri oluştu. Kitabı tamamladım ve yakında pragmatikprogramci.com adresi üzerinden pdf formatında e-kitap olarak satışa sunulacak. Bu arada iki gün önce Spring Core 3.2 sertifika sınavına katıldım ve sınavı kazanarak bu sertifikayı almayı hak ettim.

Sınava hazırlık olması amacıyla bu ve bu mock sınav sorularını inceledim. Burada sınavın içeriği hakkında bilgiler yer alıyor. Burada da sınava hazırlanış hakkında detaylı bilgi bulmak mevcut.

Sınavda Spring sunucusu (container) ve Spring bean konfigürasyonu hakkındaki sorular çoğunlutaydı. JMX hakkında iki soru hatırlıyorum. Bunun yanı sıra sınavda Spring MVC, JMS, AOP, Spring Remoting ve Spring Security konularında sorularlar yer aldı.

Sertifika sınavına girebilmek için SpringSource tarafından sunulan 5 günlük kursa katılmak gerekiyor. Bu hem Spring Integration, hem de Spring Core 3.2 sertifikası için geçerli.


EOF (End Of Fun)
Özcan Acar

SpringSource Certified Integration Specialist Sertifikası

Eylül 2012 de katıldığım SpringSource Certified Enterprise Integration Specialist kursunun ardından geçen hafta katıldığım imtihanı kazanarak SpringSource Certified Integration Specialist sertifikasını almaya hak kazandım.



Resim 1: Kursa katılım belgesi

Dört gün süren kursun içeriği aşağıdaki konulardan oluşuyor:

  • Spring Remoting
  • Spring Web Services
  • REST
  • JMS
  • Transactional JMS
  • XA Transactions
  • Spring Batch
  • Spring Integration

Spring bünyesinde Spring Integration ismini taşıyan ve EDA (Event Driven Architecture) ve SEDA (Staged EDA) mimarileri oluşturmak için kullanılabilecek bir modül yer alıyor. Certified Integration Specialist ifadesini duyanlar kursun ve imtihanın tamamen Spring Integration yapıları üzerine olduğunu düşünebilir. Ama ne yazık ki öyle değil. Certified Integration Specialist başlığı altında yukarıda saymış olduğum ve daha ziyada sistem entegrasyonu için kullanılabilecek konular yer alıyor.

SpringSource tarafından sunulan kursa katılmadan sertifika imtihanına katılmak mümkün değil. Bu diğer SpringSource sertikaları için de geçerli. Bu sertifiyı edinmenin önünde bulunan bir bariyer. Buradaki amaç belli: Kurslar aracılığı ile para kazanmak. Gönül isterdi ki ilgi duyan herkes engel olmadan bu sertifikayı edinebilsin.

Ne yazık ki internet ortamında imtihan ile ilgili kaynak bulmak kolay değil. Bu serfikanın çok yaygın olmadığının bir göstergesi. Ben bu örnek soruları keşfettim. İmtihan hakkında fikir sahibi olmak için faydalı bir kaynak. İmtihanda başarı sağlamak için SpringSource tarafından hazırlanan Spring Integration Certification Guide‘da yer alan konulara çalışmak yeterli.


Resim 2: Sertifikanın kendisi

Bu sertifika sahibi olanlar aşağıda yer alan logoyu kullanabiliyorlar.


EOF (End Of Fun)
Özcan Acar

Spring MVC

Günümüzde kullanılan birçok program web arayüzleriyle internet ve intranet ortamlarında kullanılmaktadır. Web tabanlı programların popüler olmasının sebepleri bir taraftan sadece bir web tarayıcısının (browser) yeterli olması, diğer taraftan da bu tür aplikasyonların bilgisayar üzerinde herhangi bir kurulum (install/setup) gerektirmemesidir.

Web tabanlı programlar kullanıcı (client) için herhangi bir kurulum gerektirmezken, server tarafında programın içinde çalışabileceği bir ortamın oluşturulması gerekmektedir. Bu ortamlar web protokolü olan HTTP1 üzerinden kullanıcı ile interaksiyona girebilecek yapıdadırlar. Gerekli bu ortamları oluşturmak için Apache2 ve Tomcat3 gibi server programları kullanılır. Java dünyasında web aplikasyonları oluşturmak için  Servlet/JSP teknolojileri kullanılır. Bu teknolojilerle implemente edilmiş bir sistem Tomcat gibi bir Servlet Container içinde çalışabilir, çünkü Tomcat program için gerekli altyapı hizmetlerini sunmaktadır.

Bu yazıyı PDF olarak edinebilirsiniz.

  Spring MVC (291,3 KiB, 21.922 yükleme)

Konuyla İlgili Kitaplar