Kodcu.com
google-guice + Warp + Hibernate +Apache Wicket = Lezzet
Paz 31 Oca 2010 14:26:28 | 1 yorum


Dünya değişiyor, teknolojiler değişiyor ve yeni takım oyuncuları oyuna dahil oluyor. Google guice çok da yeni sayılmaz fakat benim için farklı ve yeni bir teknoloji. Bu yüzden bu teknolojiyi sizlerle paylaşmak istedim.

Bu yazının sonuna kadar aşağıdaki kavramları üzerinde dönüp duracağım, örnekler vereceğim. Bu kavramların ne olduğunu özetlersem:

  • Dependency Injection  : Bağımlılıktan kurtulmak için bağımlılığı şırınga etmece
  • Google guice : Dependecy Injection yapmanıza olanak veren sağlam bir  araç
  • Warp - persist : google guice ile veritabanı işlemlerini (transaction gibi) gerçekleştirmek için gerekli olan kütüphane
  • Wicket : Kral 

Şimdi bu yazıyı okumaya başlamadan evvel sizden örneği kurup-çalıştırmanızı rica ediyorum, işte gerekli adımlar.

  1. maven biliyor olmanız şart (fazla birşey değil, gözünüz korkmasın lütfen). Eğer bilmiyorsanız bu adresden okuyunuz. 
  2. Bir konsol açın. windows kullananlar cmd ile
  3. Örnek uygulamayı kendi bilgisayarınıza indiriniz, şöyle ki : svn checkout http://jtpd.googlecode.com/svn/trunk/googleguice_warp_wicket_proje  
  4. 8080 portunun boş olduğundan emin olun - Bu en sık yaptığım hatadır aman siz aynı hataya düşmeyin
  5. Sonra :  mvn jetty:run , deyiniz.
  6. Az kaldı; şimdi tarayıcıyınızı açarak : http://localhost:8080/google_guice_warp_wicket/  dediğinizde uygulamanın çalışıyor olmazı lazım ! 
  7. Eğer com.wideplay warp-persist bulunamadı şeklinde bir hata alırsanız. O zaman http://www.wideplay.com/guicewebextensions2 adresine gidip, buradaki jar dosyasını bilgisayarınıza indiriniz ve aşağıdaki komut ile local repository alanınıza bu wideplay-warp kütüphanesini ekleyeniz.

    > mvn install:install-file  -Dfile="C:ASFwarp-persistwarp-persist-2.0-SNAPSHOT.jar" -DgroupId=com.wideplay 
    -DartifactId=warp-persist -Dversion=2.0 -Dpackaging=jar

    C:ASFwarp-persistwarp-persist-2.0-SNAPSHOT.jar yerine siz jar dosyasını hangi dizine koymuşsanız onu belirtiniz.


Uygulamayı görüp motive olunması için bu yöntemi bence harika. "ohh uygulama çalıştı şimdi derinlere huzurla inebilirim" yaklaşımının daha cazip olacağını düşündüm. Bazıları beğenmeyebilir ama bu psikoloji bende commodore 64 den kalma. 





Uygulama çalıştı mı ? Evet ise yola devam, hayır ise GOTO 1 ;

Öncelikle Dependecy Injection kavramından bahsetmek istiyorum. 

Dependency Injection kavramı


Türkçeye çevirirsek, bağımlılık şırangası diyebiliriz. Yani bağımlılıktan kurtulmak için bir şırınga kullanımı. Bu kavramın altınta yatan tasarım prensibi şudur : "Sen bizi arama, biz seni ararız" - "Don't call us, we call you" Kısaca Hollywood prensibi olarak geçer. Bunu biraz daha açarsak; 


Yukarıdaki resim Head First Design Patterns kitabının 296. sayfaından alınmıştır ve benim tarafımdan Türkçe ibareler yerleştirilmiştir. 


Hımm, yanlız buradaki en önemli neyin alt neyin üst seviye bileşen olduğunu anlamaktan geçer. Template tasarım kalıbının içerisinde Hollywood prensibi uygulanır, çok da zor değildir. Şimdi olayı kısa bir kod parçası ile anlatmaya çalışalım.



Kod içerisinde sadece ve sadece 29. satıra odaklanmanızı istiyorum. Bu satır Dependency Injection prensibine aykırıdır, neden ?

  • EventDaoHibernateImp() sınıfı ile doğrudan iletişim kurmuş oldunuz ve EventPage sınıfı ile EventDaoHibernateImp() sınıfı ile arasında çok sıcak ve sıkı bağlar/ bağımlılıklar oluştu. Öyle ki, ileride EventPage sınıfındaki herhangi bir hata veya yenilik EventDaoHibernateImp() sınıfını aynı şekilde EventDaoHibernateImp() sınıfındaki her hata ve yenilik EventPage sınıfını doğruda yani birinci elden ilgilendirir oldu. Tatsız değil mi ?

  • EventDaoHibernateImp() sınıfı daha üst seviye bir sınıfdır çünkü veritabanı işlemleri ile ilgilenir ve hayatta ki ne amacı budur. Böyle bir sınıfı gidip de Apache Wicket sayfasının içerisinden direk çağırmak, işlerin hepsini görüntüleme katmanında - view layer - yaptığınız anlamına gelir. Kısaca tüm iş mantığı ön yüz sınıflarında yönetilmeye başlar -ki bu ileride anlamsız derecede acı verici olabilir.

  • Kontrol üst seviye bir bileşenden (sınıfdan) - alt seviye bir bileşene (sınıfa) verilmiştir. Bu da tatsız.

  • Kısacası üst seviye bir bileşeni (sınıfı), alt seviye bir bileşen içerisinden doğrudan ama doğrudan (new anahtar kelimesi ile) çağırmanız Dependency Injection prensibine aykırıdır.

new anahtar kelimesi Java'nın özünde olan birşey değil mi, neresi hata bunun ? Evet öyle new anahtar kelimesi hala çok değerli fakat bağımlılık oluşturmadan uygulama geliştirmenin önemi, işin esas sanatsal noktasıdır.

Peki nasıl bağımlılığı şırınga ederek, bağımlılığı ortadan kaldıracağız ? Cevap aşağıda : 






Dependency Injection kavramının bir çok uygulayıcısı vardır. Benim aklıma gelen ilk ve en meşhuru Spring Framework 'dür. İkincisi ise Google Guice. Yukarıdaki kod örneği Google guice kullanılarak hazırlanmış projeden ufak bir kesittir - ki bu projeyi siz zaten bilgisayarınıza az önce indirdiniz, değil mi ?


Google guice (juice diye okuyunuz) : Dependecy Injection yapmanıza olanak veren sağlam bir araç


Google Guice teknolojisi bence Spring Framework'a nazaran basit ve anlaşılır.  Spring Framework ve Google Guice birbirlerine birebir rakip ürünler değillerdir. Spring Framework devasal alt projeleri ile bir çok probleme derman olurken, Google Guice sadece Dependency Injection ve AOP yani Aspect Oriented Programming kısmında hizmet sunar. Google Guice, Google'ın Adwords ve Wave projelerinde kullanılan sağlam bir yapı olduğunu hatırlatmak isterim. 


Özellikle Spring Security Framework kullanan bir kişi Google Guice da bu tür alt ürünlerin karşılığını bulamaz. Bu arada güvenlik işlemleri için Apache Shiro yu öneririm. Google Guice bir çok web sistemi ile entegre olarak çalışmaktadır, Örneğin Wicket, JSF, Struts. Hatta Struts için özel örnekler bile hazırlanmıştır.



Warp :: Persist

Warp - Persist projesine erişmek için buraya tıklayınız. Google Guice ile yazılan uygulamalara veritabanı desteği veren proje.   Google Guice çekirdek ve bu çekirdeğin etrafında ihtiyaca göre değişik yardımcı projeler mevcut. Warp - persist projesi de bu bunlardan biri. Peki bu proje nasıl kullanılır ?


Bu basit kod örneği çok şeyi anlatıyor. @Transactional annotation sayesinde - bir nesneyi veritabanı kaydederken güvenli bir şekilde veritabanına kaydetmeye olanak verir. Eğer kaydetme anında bir hata olursa geri alma (rollback) otomatik olarak gerçekleşir. Benim en sevdiğim kısmı ise try-catch-finally bloklarından kurtulunuyor olunması ve session.close() yapmaya gerek olunmaması. Artık herşey üst katmanın sorumluluğunda böylece bağlantı kaçakları da kolayca engellenmiş olur.


Sadece veritabanından veri çeken bir yordamı readonly transcational yapmak gayet basit.


Wicket

Bu örneğimizde Apache Wicket ile web uygulamasını gerçekleştirdik. Apache Wicket benim hayatımda gördüğüm en basit (kolay değil) , etkili ve doğal web geliştirme sistemi. İncelemenizi tavsiye ederim. Dediğim gibi Google Guice diğer java web sistemleri ile  - örneğin JSF veya Struts - rahatça çalışabilmektedir.

Uygulamanın detayları


Uygulamanın detaylarından bahsetmeye şimdi başlıyoruz. Öncelikle web.xml


web.xml de iki şeyin tanımını yaptık.
  1. warp-persist : Web oturumuna göre veritabanı bağlantılarını yönetebilmesi için. Bu büyük performans artışlarına sebebiyet veren güzel bir davranıştır.
  2. Wicket : Apache Wicket, tüm isteklere (request) bakması için vekil tayin ettik.

Sıra uygulamanın ayar işlemlerinin yapıldığı WicketApplication sınıfı

WicketApplication.java



Wicket ile Google Guice teknolojilerinin birbirlerine karıştırmak için  getGuiceInjector yordamına ve 24. satırdaki addComponentInstantiationListener(getGuiceInjector) komutuna dikkat çekmek isterim.


Bence uygulamadaki diğer dikkate değer nokta ise veritabanı işlemlerinin yapıldığı sınıfın içerisinde gerçekleşmektedir.


AbstractDaoHibernateImp.java

Hibernate session sınıfına ait nesne oluşturmak için direk new anahtar kelimesi ile değil, bağımlılığı şıranga ederek bağımlılıktan kurtulunmuş oldu. 

Kaynakça

Size göstermiş olduğum örnek http://www.jweekend.com/dev/LegUp  adresinden alınmadır. Burada değişik kombinasyonlardaki teknolojilere ait örnek projeleri alıp, üzerinlerinde rahatça oynayabilirsiniz. Göz atmanızı tavsiye ederim.

Altuğ Bilgin Altıntaş.
altug -at- kodcu.com


Bookmark and Share
Yorum
Taner Diler
Taner Diler 37 gün önce
Güzel bir yazı olmuş Altuğ Hocam, eline sağlık. Farklı katmanlara hitap eden sistemlerin birbirleri ile entegre çalışabilmeleri mutluluk verici. Benim yazdığım Spring+Hibernate+Wicke+Maven entegrasonu da uygulamasını Spring üzerine kuracaklar için faydalı olacaktır. Ama asıl uygulamarda sorun, loglama, transaction yönetimi, authorization ve authentication gibi kaygıların basit bi şekilde entegre edilip bütün odaklanmanın iş mantığına verilememesi... Burada da framework mühendisliği kavramı ortaya çıkıyor :D



or
Connect with Facebook