POJO ve EJB, Java EE geliştiriminde tercih edilen iki ayrı programlama modeli. Bu iki teknoloji, EJB 3.0'ın öğrenilmesi zor ve karmışık programlama modelini terkederek POJO tabanlı bir model seçmesiyle aynı eksende ilerleyecek gibi duruyor. Ama hala göz ardı edilemeyecek farklılıklar mevcut. POJO programlama modelini temel alan Spring çatısını kendine örnek alan EJB ile POJO'yu kıyaslarken elde ettiğim sonuçları özetlemeye çalıştım:
| POJO | EJB 3 |
Basitlik | Mimarinin geliştiriminde göz önünde tutulan nesne yönelimli ilkeler sayesinde öğrenilmesi ve kullanılması kolay bir yapıya sahip. Basitlik ve tutarlılık ön planda. | Getirdiği mimari artılarına karşın EJB 1.0 sürümünden bu yana değişen programlama modeli ve öğrenim maliyeti projeler için dezavantaj oluşturuyor. |
Test Edilebilirlik | POJO yapısı sayesinde Bağımlılık aktarımı (Dependency Injection) örüntüsü kullanılarak bileşenlerin kolay ve hızlı test edilebilirliğine imkan sağlıyor. Testler containerdan bağımsız yapılabiliyor. | Bağımlılık aktarımının sadece JNDI nesneleri ile yapılabilmesi, Session ve message-driven beanlerinin POJO olmalarına rağmen EJB Container’a ihtiyaç duymaları sebebiyle test edilebilirlik kısıtlanıyor. Bu da geliştirim sürecini olumsuz etkiliyor. |
Geliştirim Ortamı | Tomcat gibi hafif (lightweight) containerlarla geliştirilen web uygulaması hızlıca çalıştırılabiliyor. | Geliştirilen uygulamanın çalıştırılabilmesi için ağır uygulama sunucularına ihtiyaç duyuyor. Projenin ihtiyaç duymadığı özellikler de uygulama sunucusu ile ayağa kaldırılıyor. |
Collections Desteği | Hibernate çatısı ile persistence katmanında Set<String>, Set<Integer> gibi entity beanlerden oluşmayan collectionlara doğrudan destek sağlıyor. | Persistence katmanında sadece entity beanleri için collection desteği sağlıyor. Set<String>, Set<Integer> gibi collectionlara doğrudan destek sağlamıyor. |
Konfigürasyon | Spring Bean configuration dosyalarına ihtiyaç duyuyor. Annotation desteği sunuyor. | Spring Bean configuration dosyalarından daha karmaşık bir yapıya sahip EJB descriptor dosyalarına ihtiyaç duyuyor. Annotation desteği sunuyor. |
Persistence API | Kendine ait bir persistence api olmamasına karşın Template örüntüsü ile desteklenen; Hibernate, Ibatis, JPA gibi popüler çatılarla ve JDBC ile kolayca entegrasyona izin veren bir mimari sağlıyor. | EJB 3 ile Entity beanlerin yerini Hibernate, Toplink, JDO gibi persistence API’lerden devşirilen JPA belirtimi alıyor. Belirtim olması sebebiyle belirtimin yetersiz kaldığı yerlerde geliştirim sağlayıcısına bağımlı kalınabilmektedir. |
Transactions | Dağıtık transaction mimarisini JTA ile destekliyor. Spring AOP çatısı ile annotationlar kullanılarak 7 farklı Propagation-bazlı transaction tanımlanabiliyor. Transactionlar XML konfigürasyon dosyalarında ya da aspect yaklaşım kullanılarak tanımlanıyor. Spring JDBX, Hibernate ve JTA ile entegre olabiliyor. | Dağıtık transaction mimari geliştirimine olanak sağlıyor. Session beanlerin tüm public metodlarına transaction mantığı otomatik olarak uygulanıyor. Annotation tabanlı bir transaction yönetimi bulunuyor. Sadece JTA’yı destekliyor. JTA Tomcat gibi hafif containerlarda çalışmıyor. |
Güvenlik | ACEGI güvenlik çatısıyla hem nesne method çağrımı hem de HTTP istemlerinde doğrulama ve yetkilendirme yapılabiliyor. Rol-bazlının yanı sıra ACL-bazlı yetkilendirme de sağlıyor. Uygulama sunucusundan bağımsız standart bir güvenlik katmanı sağlıyor. | Tanımlı method-düzeyi rol-bazlı yetkilendirme, programatik rol belirleme özelliklerine sahip. EJB belirtiminin yeterli olmaması sebebiyle, güvenlik gerçekleştirimini uygulama sunucusuna bırakıyor. Böylece güvenlik katmanı uygulama sunucuna bağımlı hale geliyor. |
Summation of Persistence Comparison Between Spring and EJB 3.0.
Feature | Spring | EJB 3.0 |
Simple ORM Persistence | √ | √ |
Implementation | Hibernate, JPA, JDO, TopLink, iBatis | JPA (providers include Hibernate, Kodo and Toplink) |
JDBC Support | √ | -- |
Mapping | XML, Annotations | Annotations, XML |
Cache Propagation | Thread local | Transaction |
Extended cache scoping | Open session in view | Extended persistence context |
Equivalent Transaction Management Functionality in Both Spring and EJB 3.0.
Feature | Spring | EJB 3.0 |
Declarative Transactions | √ | √ |
Programmatic Transactions | √ | √ |
Demarcation | AOP | Session bean methods |
Supported Transaction Types | JDBC, Hibernate, JTA | JTA |
Support for Distributed Transactions | √ (With JTA) | √ |
Configuration | XML | Transactional by default, override with annotations or XML |
Teknolojilerin Google Trend’ten elde edilen yıllara göre arama sonuçlarının karşılaştırma tabloları:
ejb | 1.00 | ||||
pojo | 0.16 |
|
ejb | 1.00 |
| ||||||
hibernate | 1.84 | |||||||
jpa | 0.24 |
|
Sonuç olarak Java EE uygulamalarda EJB'nin tercih edilmesini gerektirecek tek durum dağıtık transaction yönetimi ihtiyacı. POJO (dolayısıyla Spring) bu ihtiyaca karşılık veremiyor. Bunun dışındaki senaryolarda değişen trendler de göz önüne alınarak POJO programlama modelini temel alan çözümlerin (Spring, Hibernate, vs.) (EJB 3.0 gibi kopyalarının yerine :) ) seçilmemesinde hiç bir neden yok.
Kaynaklar
Manning – POJOs In Action - http://www.manning.com/crichardson/
An Early Look at Spring vs. EJB 3.0 - http://www.techienuggets.com/Detail?tx=93
Spring and EJB 3 Compared - http://www.infoq.com/news/spring-ejb-3-compared
Make the Right Decision with Our Side-by-Side Comparison of Spring and EJB 3.0 - http://www.devx.com/Java/Article/32314/0/page/1
Job Trends:EJB, Spring, and Hibernate - http://www.infoq.com/news/2006/11/job-trends-ejb3-spring
Faydali bir makale olmus,
YanıtlaSiltesekkurler.