Spring Framework. KurumsalJava.com KurumsalJavaAkademisi.com. Özcan Acar Bilgisayar Mühendisi http://www.ozcanacar.com



Benzer belgeler
Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Business Delegate Tasarım Şablonu KurumsalJava.com

Decorator Tasarım Şablonu

Loose Coupling (LC) Esnek Bağ Tasarım Prensibi KurumsalJava.com

Intercepting Filter Tasarım Şablonu KurumsalJava.com

.com. Özcan Acar 2009 Kurumsal Java.com

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

Adapter Tasarım Şablonu

19 Şubat 2016 Cuma

ORM & Hibernate. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4 ahmetdemirelli@sabanciuniv.edu

Spring Framework Eğitimi

2. Bölüm Spring İle Tanışalım

.com. Kurumsal Java. Özcan Acar com

Spring Framework Eğitimi

1. Bölüm Spring'e Giriş

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

JAVA RMI ve Hibernate teknolojileri kullanılarak çok amaçlı bir yazılım altyapısı hazırlanması

BİL-141 Bilgisayar Programlama I (Java)

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Flyweight (Sinek Siklet) Tasarım Şablonu KurumsalJava.com

Java Interface ve Abstract Sınıflar

Spring Ekosisteminde Kurumsal Yazılım Geliştirme. Kenan Sevindik Harezmi Bilişim Çözümleri A.Ş.

Front Controller Tasarım Şablonu KurumsalJava.com

Swing ve JDBC ile Database Erişimi

Spring Application Framework Harezmi Bilişim Çözümleri

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

Java EE 5 Teknolojileri Jboss Seam

Sunum İçeriği. Programlamaya Giriş

Üst Düzey Programlama

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

Spring Security Framework Harezmi Bilişim Çözümleri

BİL132 Bilgisayar Programlama II

JDBC kütüphanesi, her görev için genellikle veritabanı kullanımı ile ilişkili API leri içerir:

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Client Server Database

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

Üst Düzey Programlama

BİL-142 Bilgisayar Programlama II

Üst Düzey Programlama

Spring Framework Eğitimi

Üst Düzey Programlama

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

Üst Düzey Programlama

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

Java Programlama Giriş

Spring Application Framework e Giriş

Test Güdümlü Yazılımın Tasarım Üzerindeki Etkileri KurumsalJava.com

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

JBoss Seam Next Generation Integration Framework

Klavyeden Basit Giriş/Çıkış İşlemleri

NETBEANS GUI İLE MS SQL İŞLEMLERİ

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

EGE ÜNĐVERSĐTESĐ BĐLGĐSAYAR MÜHENDĐSLĐĞĐ SUNUCU YAZILIM TEKNOLOJĐLERĐ LABORATUAR PROJESĐ

İçindekiler. Okuma lisansı info acar, için verilmiştir. Çoğaltılması ve dağıtılması yasaktır.

MVP, Observer ve Mediator Örüntüleri ile Yeniden Kullanılabilir Uygulama Bileşenleri Geliştirme

Asp.Net Veritabanı İşlemleri

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Builder Tasarım Şablonu KurumsalJava.com

Nesne Oluşturma Sırasının Tanımlanması Otomatik Veri Tipi Dönüşümü Tekil Nesneler ve Bean Scope Scope Bazlı Nesnelerin Enjeksiyonu Tanımlanabilir

1. Bölüm Java da Nesne Kalıcılığının Temelleri

public static int Toplam int x, int y

JAVA API v2.0 Belge sürümü: 2.0.2

Lecture 11: Generics

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

Rahman USTA Editör Altuğ B. ALTINTAŞ Papatya Yayıncılık Eğitim

Veritabanı İşlemleri

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Özcan Acar 2010 Kurumsal Java Akademisi.com

BİL-141 Bilgisayar Programlama I (Java)

HSancak Nesne Tabanlı Programlama I Ders Notları

Open Closed Principle (OCP) Açık Kapalı Tasarım Prensibi KurumsalJava.com

NESNEYE YÖNELİK PROGRAMLAMA

ÖZGÜR YAZILIMLAR İLE J2EE

ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

YAZILIM ÜRÜN HATTI DEĞĐŞKENLĐĞĐNĐN DENETĐM ÇEVRĐMĐ ĐLE ELE ALINMASI

İçindekiler. Okuma lisansı info acar, için verilmiştir. Çoğaltılması ve dağıtılması yasaktır

Kitapta UML diyagramları kullanılarak, tasarım şablonları görsel olarak açıklanmıştır. İçerik aşağıdaki bölümlerden oluşmaktadır:

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Üst Düzey Programlama

MOBİL UYGULAMA GELİŞTİRME

.com. Özcan Acar 2009 Kurumsal Java.com

Microsoft SQL Server 2008 Oracle Mysql (Ücretsiz) (Uygulamalarımızda bunu kullanacağız) Access

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Okunabilir Kod Yazım Standartları: Şiir Gibi Kod Yazmak

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Spring Giriş Eğitimi

ELN1001 BİLGİSAYAR PROGRAMLAMA I


JBoss Seam. Melih Sakarya

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

RSA ANAHTAR DAĞITIMI VE RSA İLE DİJİTAL İMZA OLUŞTURMA

Transkript:

Spring Framework KurumsalJava.com KurumsalJavaAkademisi.com Özcan Acar Bilgisayar Mühendisi http://www.ozcanacar.com

Giriş Son yılların en popüler Java frameworklerinden birisi olan Spring 1 ile kurumsal yapılanmaların ihtiyaç duydukları altyapıları hafif (light-weight) çözümlerle oluşturmak mümkündür. Spring ile oluşturulan programlarda EJB 2 teknolojisinden tanıdığımız deklaratif transaksiyon yönetimi, aplikasyon güvenliği, ORM persistens gibi teknolojiler bir EJB container serverine ihtiyaç duyulmadan uygulanabilir. Spring ile oluşturulan programların test edilmeleri daha kolaydır ve Spring framework XP projelerinde test güdümlü yazılımı (TDD) desteklemektedir. Sunduğu Spring MVC web frameworkü ile web tabanlı programlar hazırlamak mümkündür. Spring framework programcı için birçok işlemi basitleştirir ve kullanımını kolaylaştırır. Spring üç ayaktan oluşur: Spring basit ve sadeleştirilmiş bir API sunarak, birçok open source ürünün kullanımını ve entegrasyonunu kolaylaştırır. Son yıllarda Java platformunun (Java SE, Java EE) kullanımı, sunmuş olduğu detaylı API lerden dolayı zorlaşmıştır. Spring kendi API leri ile bu sorunu çözer. Spring içinde Dependency Injection (bağımlılıkların enjekte edilmesi) metodu kullanılarak, nesneler arası bağlar XML konfigurasyon dosyaları üzerinden otomatik olarak gerçekleştirilir. Örneğin ClassA ismindeki bir sınıf ClassB tipinde bir değişkene sahip ise, bu bağımlılık ClassA sınıfından bir nesne oluşturuluken Spring tarafından göz önünde bulundurulur. Spring otomatik olarak ClassB sınıfından bir nesne oluşturarak, ClassA sınıfından oluşturduğu nesneye enjekte eder. Đki sınıf arasındaki bağ böylece Spring tarafından Dependency Injection metodu ile oluşturulmuş olur. Spring AOP (aspect oriented programming 3 ) tarzı program yazılımını destekler. Genelde transaksiyon yönetimi, logging ve güvenlik gibi program parçaları kodun birçok yerinde kullanılır. AOP ile aslında program mantığının bir parçası olmak zorunda olmayan bu metod ve modüller merkezi bir yerde toplanarak, programdan bağımsız bir şekilde implemente edilir. Spring in amacı programcının hayatını kolaylaştırmak ve ona birçok kullanım özgürlüğü tanımaktır. Bu sebepten dolayı Spring frameworkünü oluşturan parçalar birbirinden bağımsız bir şekilde kullanılabilir. 1 2 3 Bakınız: http://www.springframework.org Bakiniz: http://java.sun.com/products/ejb/ Bakınız: http://www.onjava.com/pub/a/onjava/2004/01/14/aop.html

Resim 12.1 Spring Framework Spring Modülleri Spring, birbirinden bağımsız kullanılabilen modüllerden oluşmaktadır. Spring modül yapısı resim 10.1 de yeralmaktadır. Spring Core: Spring core paketi, Spring in temelini oluşturur. Dependency injection gibi temel fonksiyonlar Spring Core içinde implemente edilmiştir. Spring AOP: Aspect oriented programming bu modülde implemente edilmiştir. Spring in AOP özellikleri direk kullanılmasada, deklaratif transaksiyon ve güvenlik uygulamalarında Spring AOP Spring Core tarafından dolaylı olarak kullanılır. Spring MVC: Spring MVC (Model-View-Controller) Spring baz alınarak web tabanlı programlar oluşturulabilir. Spring MVC bir web frameworküdür. Spring Context: ApplicationContext ve WebApplicationContext gibi sınıflar bu modülde implemente edilmiştir. XML dosyalarından bulunan Spring bean tanımlamalarını okumak ve Spring bean nesnelerini oluşturmak için kullanılırlar. Spring DAO (Database Access Objec):

Bilgibankaları üzerinde işlem yapmak için kullanılan JDBC teknolojisini kullanımda daha basit hale getiren sınıflar bu modül içinde yeralır. Spring ORM (Object Relational Mapping): Bu modül Hibernate, JDO, TopLink ve IBatis gibi popüler ORM frameworkler ile entegrasyonu sağlamaktır. Spring Kullanımının Avantajları XP projelerinde temel altyapı ihtiyaçlarını karşılamak için Spring kullanılabilir. Bunlar otomatik transaksiyon yönetimi, sistem güvenliği, Hibernate gibi bir ORM frameworkünün entegrasyonu, web servisi oluşturulması ve kullanımı, EJB ve RMI serverlerinin kullanımı gibi konular olabilir. Spring değişik komponentlerin entegrasyonu için gerekli altyapı hizmetlerini sunar. Spring kullanımı sonucu elde edilen avantajları şu şekilde sıralıyabiliriz: Basit Java sınıfları (POJO Plain Old Java Object) kullanılarak yazılım yapılabilir. Bu sınıfların test edilmesi, debugging yöntemiyle hataların aranması ve kurulumu (deployment) daha kolaydır. EJB teknolojisinde olduğu gibi bir EJB container serverine ihtiyaç duyulmamaktadır. Spring MVC ile web tabanlı programlar oluşturmak mümkündür. Web applikasyonlarında deklaratif transaksiyon yönetimi, güvenlik ve bilgibankası bağlantısı gibi temel altyapı ihtiyaçları Spring ve Spring MVC tarafından sağlanır. Spring tekeri yeniden icat etmeden, pisayadaki mevcut teknolojilerin entegre edilmesini kolaylaştırmaktadır. Spring modüler bir yapıya sahiptir. Proje gerekleri doğrultusunda belirli Spring modülleri kullanılabilir. Spring, konfigurasyon dosyalarında yapılacak ayarlamalar ile otomatik olarak Singleton nesneler oluşturabilir. Bunun için özel Singleton sınıfların oluşturulması gereği ortadan kalkar. Spring interface sınıflar için değişik türde implementasyon yapılmasını ve kullanım esnasında konfigurasyon dosyaları üzerinden implementasyon sınıf seçinimi kolaylaştırır. Bu açıdan bakıldığında tasarım şablonlarının kullanımı Spring aracılığıyla daha kolay hale gelmektedir. Sundugu Servlet Mock sınıfları ile, Spring MVC ile oluşturulan web tabanlı programların Tomcat gibi bir Servlet container serverinden bağımsız olarak test edilmesini kolaylaştırır. Dependency Injection Java gibi nesneye yönelik programlama (OO Object Oriented) yapılabilen bir dilde, gerçek hayatta var olan nesneleri Java sınıfları aracılığıyla modelleriz. Bu sınıflardan Java programlarında kullanılan nesneler üretilir. Nesneler görevlerini yerine getirirken başka nesneleri kullanabilirler. Böylece nesneler arası bağımlılıklar oluşur. Java programcılarının çok sıklıkla karşılaştıkları NullPointerException, kullanılmak istenen nesnenin null değerine sahip olmasından kaynaklanmaktadır, yani new operatörü ile gerekli nesne oluşturulmamıştır. NullPointerException hatasını önlemek için bağımlılık duyulan nesnelerin oluşturulması

gerekmektedir. Bunu coğu zaman aşağıdaki göreceğimiz örnekteki gibi elden yapmamız gerekmektedir. Kod 12.1 ClassA.java - Dependency Injection örneği / Basit bir Java Bean (POJO - Plain Old Java Object) @author Oezcan Acar / public class ClassA / ClassA ile ClassB arasinda bu sinif degiskeni üzerinden bagilimlilik vardir. / private ClassB classb; public ClassB getclassb() return classb; public void setclassb(classb classb) this.classb = classb; public void print(string msg) classb.print(msg); ClassA ismindeki sınıfın ClassB tipinde bir sınıf değişkeni mevcuttur. Bu sebepten dolayı ClassA ile ClassB arasında bir bağımlılık oluşmaktadır. ClassA, ClassB olmadan görevini yerine getiremeyecektir. Bu sebepten dolayı ClassA sınıfından bir nesne oluşturulduğunda, classb sınıf değişkeninin değeri null olmamalıdır, aksi taktirde print() metodu bünyesinde bir NullPointerException oluşur. Kod 11.2 ClassB.java - Dependency Injection örneği / Basit bir Java Bean (POJO - Plain Old Java Object) @author Oezcan Acar

/ public class ClassB public void print(string msg) System.out.println(msg); ClassB basit bir POJO (plain old java object) sınıftır ve print() isminde bir metoda sahiptir. ClassA nin ClassB ye olan bağımlılığında dolayı, bu sınıfların kullanımı aşağıdaki şekilde olmak zorundadır: Kod 11.3 Test.java - Dependency Injection örneği import org.javatasarim.spring.util.springutil; / Dependency Injection test sinifi @author Oezcan Acar / public class Test public static void main(string[] args) ClassA classa = new ClassA(); ClassB classb = new ClassB(); classa.setclassb(classb); classa.print("hello Spring World"); Örnekte görüldüğü gibi ClassA ve ClassB den oluşan bir nesne ağı oluşturulmuştur. Birçok nesneden oluşan bir nesne ağında, bağımlılık duyulan nesnelerden sadece bir tanesinin değerinin null olması, NullPointerException oluşmasına sebep verecektir. Ayrıca nesne ağında yer alan nesnelerin new operatörü ile tek tek oluşturulması ve set() metotları ile ağ içine yerleştirilmeleri zaman alıcı ve hataya yol açabilecek bir yöntemdir. Spring dependency injection kullanılarak nesne ağının oluşturulması daha sadeleştirilebilir. Spring bünyesinde, kullanılacak nesneler applicationcontext.xml ismini taşıyan bir XML dosyasında tanımlanır. Bu dosya içinde her sınıf için bir <bean/> tagı yeralır. Bir sonraki tabloda applicationcontext.xml dosyasının içeriğini görmekteyiz. Kod 11.4 applicationcontext.xml - Dependency Injection örneği

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> </beans> <bean id="classa" class="org.javatasarim.spring.dependencyinjection.classa"> <property name="classb" ref="classb" /> </bean> <bean id="classb" class="org.javatasarim.spring.dependencyinjection.classb"> </bean> ClassA ve ClassB isimlerinde iki Spring Bean tanımlıyoruz. Spring in ClassA tipi bir nesne oluşturabilmesi için bu sınıfın paket ismini tanıması gerekmektedir. ClassA ile ClassB arasındaki bağı oluşturmak için <property/> tagı kullanılır. Bu tag bünyesinde name elementi ile enjekte edilmesi gereken değişken tanımlanır. <property name= classb ref= ClassB /> şeklinde bir tanımlama şu anlama gelmektedir: ClassA sınıfında classb isminde bir değişken vardır. ClassA dan bir nesne oluştururken, classb ismindeki değişkeninde oluşturulması gerekmektedir. classb nesnesi oluşturulurken referans olarak (ref= ClassB ) ClassB ismini taşıyan Spring Bean (<bean id= ClassB.../> kullanılabilir. Spring bu tanımlamalar yardımı ile ClassA isminde bir nesne oluştururken, bu sınıfın değişkeni olan classb yide oluşturup, otomatik olarak ClassA nesnesine enjekte edecektir. Bu işleme dependency injection yani bağımlılıkların enjekte edilmesi adı verilir. Spring in nasıl kullanılabileceğini yeni bir örnekte görelim: Kod 11.5 TestSpring.java - Dependency Injection örneği import org.javatasarim.spring.util.springutil; / Spring Dependency Injection test sinifi @author Oezcan Acar / public class TestSpring public static void main(string[] args) / SpringUtils sinifi araciligi ile bir Spring Bean olan ClassA sinifindan classa nesnesi edinilir. / ClassA classa = (ClassA)SpringUtil.getBean("ClassA"); /

Eger classa nesnesi Spring üzerinden dependency injection ile olusturulmamis olsa idi, asagida yeralan class.pring() metodu NullPointerException olustururdu, cünkü ClassA.print() metodu bünyesinde ClassB tipinde bir degisken kullaniliyor. classb null oldugundan, classa.print() NullPointerException verir. / classa.print("hello Spring World"); Kod 11.6 SpringUtil.java - Dependency Injection örneği import org.springframework.context.support.classpathxmlapplicationcontext; / SpringUtils araciligi ile Spring ApplicationContext'in tanimlandigi applicationcontext.xml dosyasi edinilir. getbean(string beanname) ile bu dosyada tanimlanmis bir Spring Bean nesnesine ulasilir. @author Oezcan Acar / public class SpringUtil private static final ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext("spring/applicationContext.xml"); public static Object getbean(string name) return factory.getbean(name); TestSpring sınıfı işlev itibariyle Test sınıfı ile aynı yapıdadır. Aradaki tek fark, TestSpring bünyesinde Spring frameworkünün ve beraberinde getirdiği dependency injection metodunun kullanılıyor olmasıdır. Görüldüğü gibi SpringUtil.getBean( ClassA ) ile applicationcontext.xml bünyesinde tanımlanmış olan ClassA Spring Bean kullanılmaktadır. Spring burada genel olarak Factory tasarım şablonunda da olduğu gibi nesne üreten bir fabrika olarak düşünülebilir. Spring bu durumda otomatik olarak ClassA ve ClassB den oluşan nesne ağını oluşturur ve kullanıma sunar. Son satırda yeralan classa.print() metodu, classb nesnesinin otomatik olarak enjekte edilmesinden dolayı NullPointerException hatası vermeyecektir. Spring ile Tasarım Sablonu Kullanımı

Birçok tasarım şablonunda interface sınıflarının önemli bir yer almaktadır. Interface sınıflarının kullanılmasının amacı, kullanıcı sınıf ile, interface implementasyonu arasında esnek bir bağ oluşmasını sağlamaktır. Kullanıcı sınıf, sadece interface bünyesinde bulunan metot isimlerine tanımak zorundadır. Bu metotların nasıl ve hangi sınıf tarafından implemente edildiği kullanıcı sınıf için önem taşımamaktadır. Kullanıcı sınıfın hangi implementasyon sınıfını kullandığını bilmek zorunda olmayışı, bu iki sınıf arasında esnek bir bağın oluşmasını sağlar. Spring bu açıdan bakıldığında interface sınıfların kullanımı için biçilmiş bir kaftandır. Spring XML dosyasında (applicationcontext.xml) kullanılması gereken implementasyon sınıfını tanımlayarak, kullanıcı sınıfı etkilemeden sistem konfigurasyonunu değiştirebiliriz. Aşağıda yer alan örnekte bir posta kutusunda (Mailbox) yaralan mektuplara (Mail) erişmek için Dao tasarım şablonu kullanılmaktadır. Posta kutusu ve barındırdığı mektuplar bir bilgibankasında yer almaktadır. Bilgibankasına erişim Dao tasarım şablonu ile daha transparan hale getirilmiş olur. Kod 11.7 Dao interface sınıfı import java.util.arraylist; / Dao interface sinifi @author Oezcan Acar / public interface Dao ArrayList<Mail> getmails(); Đlk olarak Dao isminde bir interface sınıf tanımlıyoruz. Bu sınıf bünyesinde, getmails() metodu yer almaktadır. Kullanıcı sınıflar sadece Dao interface sınıfını tanımak zorunda bırakıldıkları sürece, hangi implementasyonun kullanıldığı onlar için önem taşımıyacaktır. Kod 11.8 JdbcDaoImpl.java - Dao implementasyonu import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.util.arraylist; / Jdbc DAO implementasyonu @author Oezcan Acar /

public class JdbcDaoImpl implements Dao public ArrayList<Mail> getmails() ArrayList<Mail> mails = new ArrayList<Mail>(); Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try con = getconnection(); pstmt = con.preparestatement("select from mail"); rs = pstmt.executequery(); while(rs.next()) Mail mail = new Mail(); mail.setsender(rs.getstring(1)); mail.setsubject(rs.getstring(2)); mail.setbody(rs.getstring(3)); mails.add(mail); catch (Exception e) throw new RuntimeException(e); finally try if(con!= null &&!con.isclosed()) con.close(); catch (SQLException e) e.printstacktrace(); return mails; private Connection getconnection() // kullanilan bilgibankasina // göre implemente edilmesi gerekiyor return null; Gerçek bir bilgibankası (Oracle, Mysql gibi) kullanabilmek için JdbcDaoImpl isminde, Dao interface sınıfını implemente eden bir sınıf oluşturduk. Yukarda yeralan bu sınıf Jdbc üzerinden mail tablosunda (select from mail) bulunan mektulara ulaşarak Mail nesneleri

oluşturur. Oluşturulan Mail nesneleri bir ArrayList içine yerleştirilerek, metodu kullanan sınıfa geri verilir. Bunun yanısıra gerçek bir bilgibankası kullanma zorunluluğunu ortadan kaldırmak için, bir dummy (sahte) implementasyon oluşturulabilir. Aşağıda yeralan DummyDaoImpl gerçek bir bilgibankası kullanmak zorunda kalmadan, sistemin test edilmesi için kullanılabilir. Kod 11.9 DummyDaoImpl.java - Dao implementasyonu import java.util.arraylist; / Dummy DAO implementasyonu @author Oezcan Acar / public class DummyDaoImpl implements Dao public ArrayList<Mail> getmails() ArrayList<Mail> mails = new ArrayList<Mail>(); Mail mail1 = new Mail(); mail1.setsender("sender1"); mail1.setsubject("subject1"); mails.add(mail1); Mail mail2 = new Mail(); mail2.setsender("sender2"); mail2.setsubject("subject2"); mails.add(mail2); return mails; JdbcDaoImpl sınıfında olduğu gibi, DummyDaoImpl sınıfıda getmails() metodunun implementasyonunu yapmaktadır. Buraya kadar bir interface sınıf ve iki değişik implementasyon sınıfını oluşturduk. Spring ile istenilen tipte bir implementasyonun kullanılabilmesi için aşağıdaki şekilde applicationcontext.xml bünyesinde Dao Spring Bean in oluşturulması gerekmektedir. Kod 11.10 applicationcontext.xml ext

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> </beans> <bean id="dao" class="org.javatasarim.spring.dao.jdbcdaoimpl"> </bean> Kod 11.11 Test.java ext import java.util.arraylist; import org.javatasarim.spring.util.springutil; / Test programi. @author Oezcan Acar / public class Test public static void main(string[] args) Dao dao = (Dao)SpringUtil.getBean("Dao"); ArrayList<Mail> mails = dao.getmails(); for(int i=0; i < mails.size(); i++) Mail mail = mails.get(i); System.out.println("Sender: " +mail.getsender()); System.out.println("Subject: " +mail.getsubject()); Test.main() bünyesinde SpringUtils sınıfı yardımıyla Spring tarafından yönetilen Dao isimli bir Spring Bean ediniyoruz. Bu nesne, applicationcontext.xml içinde tanımlamış olduğumuz Dao implementasyon sınıfından üretilmiş bir nesne olacaktır. JdbcDaoImpl implementasyon sınıfını kullandığımız için SpringUtil.getBean( Dao ) bize bu sınıftan bir nesne üreterek geri verecektir. Tasarım açısından Spring in beraberinde getirdiği esnekliği Test sınıfında görmekteyiz. Test sınıfı ile Dao interface sınıfı arasında bir bağımlılık mevcuttur, çünkü Test sınıfı Dao interface sınıfını kullanmaktadır. Spring istenilen tipte bir implementasyon (JdbcDaoImpl) oluşturarak, Test sınıfına iletir. Test sınıfı sadece Dao interface sınıfını tanıdığı için, hangi implementasyonu kullandığını bilmek zorunda değildir. Bu sayede Test sınıfını etkilemeden kullanılan Dao implementasyonu her zaman değiştirilebilir. Spring, applicationcontext.xml içinde tanımlanmış olan implementasyon sınıfını kullanarak, gerekli implementasyon nesnesini oluşturacak ve kullanıma sunacaktır.

Spring in sağlamış olduğu diğer entegratif özellikleri diğer bir makalemizde yakından inceleyeceğiz. EOF ( End Of Fun) Özcan Acar Bilgisayar Mühendisi KurumsalJava.com KurumsalJavaAkademisi.com