Spring Giriş Eğitimi Bu eğitimde Spring ‘ın hangi problemlere karşı etkili olduğundan bahsedeceğim. Ayrıca çekirdek Spring teknolojisinin nasıl işlediği; Dependency Injection - DI ve Inversion of Contol kavramlarını basit bir örnek üzerinden anlatacağım. Problem Spring açık kaynak kodlu, kurumsal uygulamaların karmaşıklığını gidermek için ortaya çıkmış bir projedir. Bu karmaşık problemlerden bahsedelim : ● ● ● ● Bağlaşım kesme problemi Transaction desteği (Veritabanı işlemleri için şart) Güvenlik alt yapısı (Hak hukuk ayarlamaları için ) Dağıtık programlama ihtiyacı (Özellikle yoğun trafik alan uygulamalar için çok önemli) Tarihçe Aslında konuyu daha iyi anlamak için biraz daha geriye gidelim; 1998 yılında Sun Microsystems’ın ortaya koyduğu Enterprise Java Beans 1.0 sürümü (namı diğer EJBs) başlıca yukarıdaki problemlere derman olması için yayınlandı. Fakat gel gelelim EJB teknolojisini projelerde uygulamak ciddi anlamda karmaşıklık getiriyordu. Daha da kötüsü kodun gereksiz yere büyümesine sebebiyet veriyordu. Bunun doğal sonucu olarak da EJB teknolojisi zaman içerisinde popülerliğini kaybetti. Yanlız 2011 yılında EJB light-weight sürümü ile tekrardan çıkış yakalama çabasında olduğunu belirtmek isterim. Spring Teknolojileri ve Genel Mimari İşte Spring; kurumsal uygulamaların bu karmaşık ihtiyaçlarına cevap verebilen bir altyapıdır; Günümüzde Spring doğal olarak çok daha fazla probleme çözüm oluyor. İşte Spring yapısının genel mimarisi : Çekirdek Spring‘in en temel fonksiyonu Inversion of Control ve DI (Dependency Injection) kavramlarını gerçekleştirmektir. Proje ve Apache Maven Kod örneklerinin detaylarına aynı sayfadan kod.zip dosyasını indirerek ulaşabilirsin. Bu proje Apache Maven tabanlıdır. Eğer Apache Maven bilmiyorsan çok kısa bir sürede Maven ‘ı öğrenmek için Kodcu.com içerisindeki Maven videolarını izlemeni tavsiye ederim. Google’dan “kodcu Maven” diye aratınca ilgili video karşına hemen çıkacaktır. Spring-giris projesi konsoldan çalışabilecek çok basit bir Spring uygulamasıdır. Amacı Spring’in en yalın halini ve etkilerini göstermektir. Not : Bu uygulamayı IntelliJ 10 sürümünde geliştirilmiştir. Proje içerisinde Gorev ve Memur adında iki adet interface sınıfı tanımlıdır. Buradaki amacım hangi memura hangi görevin gideceğini belirlemek fakat esas dikkat edilmesi gereken nokta; Gorev sınıfının alt elemanlarıyla, Memur sınıfının alt elemanları arasındaki bağı Spring ile keşmiş nasıl kestiğimdir. İşte Detaylar : Gorev.java Interface kavramı uygulamanızı esnek hale getirmek için eşsiz mekanizmalardır. Şimdi Gorev sınıfından türeyen iki alt sınıfa bakalım GuvenlikGorevi.java OkulGorevi.java Buraki Gorev sınıfını bir anlaşma / sözleşme gibi düşünebilirsin. OkulGorevi ve GuvenlikGorevi sınıflarını da bu sözlesmenin (Gorev.java) yüklenicileri olarak hayal edebilirsin. Uygulama çalıştığında ihtiyaca göre hangi yükleniciye ihtiyaç varsa Spring bunları otomatik olarak oluşturacak ve iletecektir. Memur.java Ogretmen.java Öğretmen sınıfı yapılandırıcısına (satır 9) Gorev tipinde bir değişken alıyor. Aa ha ! İşte buraya çalışma anında kaç farkı nesne gelebilir ? Cevap :2 1 - OkulGorevi 2 - GuvenlikGorevi Hangisinin geleceğin kodcu.xml (biraz daha aşağıda) dosyasından belirteceğiz. İşte Inversion of Control ve DI (Dependency Injection) kavramları devreye girdi bile ! Peki esas sorumu soruyorum; Ogretmen hangi gorevin geleceğinden haberdar mı ? Ya da şöyle sorayım Ogretmen sınıfı çalışma anında hangi nesnenin geleceği umrunda mı ? Değil. İşte buna bağlaşımı kesmek denir. (decoupling) . Polis.java Memur, Ogretmen ve Polis arasındaki ilişki; Gorev, OkulGorevi ve GuvenlikGorevi sınıflarından farklı değil Main.java Bu test etmek için kullanılan basit bir sınıf. Dikkat edilirse 17. satırda Spring yapısı ayağa kaldırılıyor. Bu işlem sırasında kodcu.xml içerisindeki tanımlamalar esas alınacaktır. Ekran çıksı ne olur ? kodcu.xml Spring yapısını kontrol ettiğimiz dosya kodcu.xml. Dikkat edilirse Ogretmen ve OkulGorevi sınıfları Spring tarafından oluşturuluyor yanı kontrolü Spring yapısına verdik işte buna basitçe Inversion of Contol denir; yani kontrolü devir teslim etmiş bulunuyoruz. Uygulamayı çalıştırmak için Bu uygulama maven tabanlı olduğu için istediğiniz maven destekli IDE’de açabilirsiniz. IntelliJ , Eclipse veya Netbeans. Sonuç Şimdi diyebilirsin ki; Ogretmen sınıfının yapılandırıcına Gorev atmak için bu kadar eziyete ne var ? Ufak uygulamalarda Spring’in faydası görülmeyebilir. Zaten her uygulama da Spring alt yapısını kullanmak doğru olmayabilir. Fakat şöyle düşün; Spring en başta bir Interface kullanma zorunluluğu getiriyor, bir disiplin. Ayrıca uygulama büyüdükçe sınıfların karmaşıklığını Spring ile çok rahat ve güvenli bir şekilde yönetebilirsin. Bu örnek üzerinde konuşursak Ogretmen ve OkulGorevi sınıflarına ait nesne Spring tarafından oluşturuluyor ve yönetiliyor. Uygulamanın karmaşıklığı artsa da Spring alt yapısı size güvenli bir ortam sunmaya devam edecektir. Aynı şekilde kodcu.xml içerisindeki 8 satıra bakacak olursanız OkulGorevi nesnesi Ogretmen nesnesine zerk ediliyor. Zerk (Dependecy Injection - DI) kavramının somut işleyişini buradan açık bir şekilde görülebilir. Bu ayar işlemlerini xml dosyasını içerisinden yapmaMA şansımız elbette var. Bu konuyu bir sonraki ders içerisinde anlatmaya çalışacağım. Spring her ne kadar Java dünyasından çıkmış bir alt-yapı olsa da, Microsoft .NET dünyasındaki uygulamalar içinde çözüm sunmaktadır. Detaylı bilgi için http://www.springframework.net/ adresini ziyeret edebilirsin. Bu yazıyla Spring felsefesini ve yapısını başlangıç düzeyinde de anlatmaya çalıştım. Bir sonraki ders görüşmek üzere. İyi çalışmalar... Altuğ Bilgin Altıntaş altug - at - kodcu.com