Spring Framework
Spring Framework
1. Definisi Spring Spring adalah framework pengembangan aplikasi ysang dikembangkan oleh Rod Johnson, muncul karena spesifikasi EJB yang memaksakan pengembangan komponen harus mengikuti aturan EJB agar dapat berjalan dalam aplikasi server SJAS dan Jboss. Dengan Spring, pengembangan komponen dapat dilakukan dengan teknik pemrograman yang lebih sederhana. 2. Sejarah Spring Spring merupakan open source framework yang diciptakan oleh Rod Johnshon, Pada akhir tahun 1996, Sun menerbitkan spesifikasi Java Beans 1.00A. spesifikasi ini menjelaskan tentang peraturan peraturan coding java yang memperbolehkan suatu objek yang bisa menjadi komponen yang bisa dipakai berulang ulang ke dalam suatu aplikasi java yang lebih kompleks. selanjutnya pada tahun 1998, Sun kembali menerbitkan policiesnya tentang EJB(Enterprise Java Beans) yang merupakan elemen yang reusable namun dengan kelebihan kelebihan seperti server side dan menyediakan banyak kemampuan untuk enterprise service. EJB dibuat tentunya untuk mempermudah para developer untuk membuat aplikasi enterprise, namun para developer merasa tidak demikian. EJB sulit dan sangat rumit sehingga justru membuat para developer justru kehilangan minat terhadap EJB ini. Untungnya sekarang pemrograman JAVA lebih berkembang, seperti adanya AOP(Aspect Oriented Programming) dan IoC(Inversion of Control) sehingga memberikan Java Beans kekuatan yang lebih, dibandingkan EJB yang sangat rumit.
3. Keuntungan Spring IoC Sebagai sebuah framework, spring menawarkan loosely coupling dengan teknik yang dinamakan IoC. jadi dengan menggunakan IoC, objek memberikan dependenciesnya saat pembuatan dengan menggunakan entity luar yang mengkoordinir setiap objek di system. Untuk lebih jelasnya akan dijelaskan pada bagian Dependency Injection. AOP AOP merupakan salah satu paradigma pemrograman dengan tujuan untuk meningkatkan modularitas dengan memfokuskan pada pemisahan-pemisahan modul dengan tujuan-tujuan khusus yang biasa disebut dengan "Crosscutting Concerns". Bersifat Container Spring juga merupakan sebuah Container yang mengatur daur hidup dan konfigurasi dari objek. Dalam spring Anda dapat mendeklarasi bagaimana setiap objek tersebut seharusnya dibuat, bagaimana seharusnya di konfigurasikan dan bagaimana objek tersebut dapat berasosiasi dengan yang lain. Lightweight container Beberapa container aplikasi seperti, EJB Container memaksa kita mengikuti suatu aturan (EJB-spec) untuk membuat komponen interface atau model. EJB merupakan standar pengembangan komponen dalam java yg berjalan disisi server dengan suatu kontrak terhadap aplikasi server seperti SJAS dan JBoss. Namun dengan konsep lightweight tidak diperlukan lagi suatu spesifikasi khusus dalam pembuatan komponen (POJO), berikut ciri lightweight container : 2
POJO Life-cycle management Dependency Injection Consistent Configuration Service Attachment merupakan sebuah framework, maksudnya spring
Merupakan Framework Spring memungkinkan untuk membangun dan mengkonfigurasi sebuah aplikasi yang kompleks dari komponen-komponen yang sederhana. Dalam Spring, objek didefinisikan dalam file XML.
4. Dependency Injection (DI) Pada bagian sebelumnya telah diuraikan sedikit tentang IoC, dimana IoC merupakan nama lain dari Dependency Injection. Jadi dengan menggunakan IoC, objek memberikan dependenciesnya saat pembuatan dengan menggunakan entity luar yang mengkoordinir setiap objek di system. Jadi IoC ialah pembalikan tanggung jawab dengan memandang bagaimana sebuah objek mendapatkan references untuk mengumpulkan objek. jadi daripada objek melookup dependencies dari container, container justru memberikan dependenciesnya ke objek saat instansiasi tanpa menunggu untuk diminta. Pada IoC scenario, container membuat semua objek, kemudian mewire semua objek tadi dengan cara mensetting properti property yang dibutuhkan, dan memanggilnya saat method getBean di panggil. 5. Aspect Oriented Programming (AOP) Dalam pembuatan sebuah aplikasi kita harus memperhatikan 2 aspek utama, yaitu, core concern dan system-wide concern atau crosscutting concern, core concern merupakan fungsi fungsi utama dalam sebuah aplikasi, dalam hal ini adalah logika bisnis. Kemudian system-wide 3
concern atau crosscutting concern merupakan fungsi fungsi yang tersebar di seluruh bagian software, fungsi fungsi ini bukan merupakan fungsi utama, fungsi ini bersifat pendukung, namun keberadaanya tetap diperlukan sebagai syarat untuk memenuhi criteria software yang baik, Contohnya adalah security, pooling, dan logging. Dalam pemrograman JAVA kita terbiasa dengan konsep pemrograman yang menyatukan crosscutting concern dengan core-concern, misalkan fungsi logging untuk debugging, dimana kita biasanya membuat fungsinya menyatu dengan logika bisnis dalam satu sistem, karena memang dalam metodologi OOP diharuskan seperti itu, penjelasan di atas jika diimplementasikan dalam bentuk code akan menjadi seperti di bawah ini : public class MyAllInOneClass { public void superMethod() { // lakukan autorisasi // logging start business process // lakukan proses bisnis // logging end business process } public void save() {...} public void load() {...} } Dalam AOP sebuah system yang terdiri dari beberapa concern disebut tangled. AOP(Aspect Oriented Programming) merupakan metodologi pemrograman yang memisahkan core concern dengan crosscutting concern dengan menggunakan modul yang disebut dengan aspect. Ada beberapa tahap yang diperlukan dalam membangun sebuah system, dengan menggunakan metodologi AOP, yaitu Aspectual Decomposition, Concern Implementation, dan Aspectual Recomposition, berikut adalah penjelasnya.
1. Aspectual Decomposition Pada tahap ini kita melakukan decompose requirements untuk mengidentifikasi core concern dan crosscutting concern. 2. Concern Implementation Pada tahap ini kita mengimplementasikan tiap concern secara independen. Perhatikan bahwa pada tahap ini masing-masing concern diimplementasikan pada modulnya sendiri, terpisah dengan modul lain. Dengan demikian kita bisa membuat modul per modul secara bertahap, tidak perlu memikirkan sekian banyak modul dalam satu waktu. 3. Aspectual Recomposition Pada tahap ini kita membuat recomposition rules dengan membuat modularization unit atau aspect. Proses recomposition disebut juga weaving atau integrating, dan akan membentuk sistem akhir berdasarkan aspect tersebut. Modularisasi adalah pemecahan system yang kompleks menjadi sederhana dengan membaginya ke dalam clas class. 6. Container BeanFactory dan ApplicationContext Dalam Spring, objek tidak bertanggung jawab dalam mencari atau membuat objek lain. Sebaliknya, mereka di beri referensi ke objek yang akan bergabung oleh sebuah container. Tindakan menciptakan keterhubungan antar objek-objek merupakan esensi dari Dependency Injection (DI) atau yang lebih umumnya disebut sebagai wiring. Dalam aplikasi berbasis Spring, objek-objek aplikasi akan aktif didalam container-container Spring. Seperti digambarkan pada gambar 1.1, container akan membuat objek-objek dan akan dihubungkan satu sama lain, mengkonfigurasi objek-objek tersebut, dan mengatur daur hidup objek-objek itu dari awal instansiasi sampai menghancurkan objek
tersebut. Container merupakan inti dari Framework Spring. Container Spring menggunakan Dependency Injection (DI) untuk mengatur komponenkomponen yang menyusun aplikasi. Termasuk juga dalam mengasosiasikan kolaborasi antar komponen-komponen tersebut. Dengan demikian, objek-objek ini akan lebih mudah untuk dipahami, dapat di gunakan kembali, dan mudah dalam melakukan unit testing. Spring memiliki beberapa container yang dapat di kategorikan kedalam jenis yang berbeda. Antara lain, BeanFactory (yang didefinisikan dalam kelas org.springframework.beans.factory.BeanFactory) (didefinisikan dalam kelas merupakan container paling sederhana yang menyediakan dukungan dasar untuk DI. ApplicationContext org.springframework. context. ApplicationContext ) yang akan membangun pengertian antar bean factory dengan menyediakan layanan framework aplikasi, seperti kemamupan untuk memecahkan pesan tekstual dari properti file dan kemampuan untuk mempublikasikan event kepada event listener.
Gambar 1.1 Dalam aplikasi Spring, Objek-objek dibuat, dihubungkan satu sama lain,aktif dalam container Spring. Container BeanFactory Seperti namanya, BeanFactory merupakan implementasi dari Factory Design pattern. Artinya, ini adalah kelas yang bertanggung
jawab untuk menciptakan dan membagikan objek bean. Akan tetapi, tidak seperti implementasi dari pola Factory lainnya, yang sering membagikan sebuah tipe objek, namun bean factory merupakan factory dengan tujuan umum, seperti menciptakan dan memberikan banyak tipe dari bean. Ada beberapa implementasi BeanFactory di Spring. Tapi yang paling sering digunakan adalah org.springframework. beans. factory. xml. XmlBean-Factory, yang akan mengisi objek bean berdasarkan definisi yang berada pada sebuah file XML. Untuk membuat kelas XmlBeanFactory, Anda harus melewati objek dari org.springframework.core.io.Resource ke konstruktor. Objek Kelas Resource akan menyediakan XML ke factory. Misalnya, potongan kode berikut menggunakan FileSystemResource untuk menciptakan definisi bean XmlBeanFactory yang dibaca dari file XML dalam sistem file:
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("c:/beans.xml"));
Pada baris kode diatas, memberi tahu bean factory untuk membaca pendefinisian dari file XML. Namun, bean factory tersebut tidak langsung menginstansiasi, melainkan hanya memuat definsi-definisi dari bean dan baru menginstansiasi sampai bean tersebut dibutuhkan. Untuk mengambil objek bean dari BeanFactory, cukup memanggil method getBean(), melalui ID dari objek bean yang akan dipanggil.
MyBean myBean = (MyBean) factory.getBean("myBean");
Ketika method getBean() dipanggil, factory akan instantiasi bean dan mengatur properties dari bean menggunakan DI. Dan disinilah daur hidup objek bean dimulai di dalam container Spring. Container Application Context. Container bean factory akan lancar berjalan pada aplikasi sederhana. Namun, untuk mendapatkan manfaat yang lebih besar dari
Framework Spring, anda dapat menggunakan container yang lebih handal yang disebut application context. Pada dasarnya Application Context memiliki kesamaan dengan BeanFactory. Keduanya meminta definisi dari bean, menghubungkan satu sama lain, dan memberikan bean terebut kepada yang meminta. Tapi Application Context menawarkan layanan yang lebih dari itu, antara lain : pesan teks, termasuk dukungan untuk internasionalisasi ( I18N ) dari pesan tersebut. ApplicationContext menyediakan cara yang umum untuk memanggil file-file sumber berupa gambar. ApplicationContext dapat menyebarluaskan event ke bean yang mendaftarkan diri sebagai pengguna event tersebut. Karena menyediakan fungsionalitas tambahan, sebuah Application Context lebih disukai daripada BeanFactory di hampir semua aplikasi. Di antara banyak implementasi dari ApplicationContext, ada tiga yang umum digunakan: ClassPathXmlApplicationContext Memanggil file XML berada pada ClassPath FileSystemXmlApplicationContext Memanggil file XML yang berada pada File System XmlWebApplicationContext Memanggil file XML yang tersimpan dalam aplikasi web Memuat application context dari file system atau pun dari classpath sama artinya dengan bagaimana caranya memuat bean kedalam bean factory. Berikut adalah cara memuat dengan FileSystemApplicationContext : yang ApplicationContext menyediakan cara untuk memcahkan
Begitu juga ketika kita ingin memuat application context dengan menggunakan kelas ClassPathXmlApplicationContext :
ApplicationContext context = new ClassPathXmlApplicationContext("foo.xml");
Perbedaan antara penggunaan FileSystemXmlApplicationContext dan pada ClassPathXmlApplicationContext file system (media yaitu kalau Sedangkan FileSystemXmlApplicationContext akan mencari file XML yang terletak penyimpanan). ClassPathXmlApplicationContext, akan ClassPath. Selain dari fungsi tambahan yang ditawarkan oleh application context, satu lagi perbedaan besar antara application context dan bean factory adalah bagaimana satu bean di-muat. Sebuah bean factory tidak akan memuat semua objek bean sampai method getBean() dipanggil. Sedangkan application context bekerja lebih cerdas yaitu dengan melakukan preload terlebih dahulu untuk semua bean tunggal . Dengan melakukan preload dari bean, itu berarti memastikan bahwa mereka akan siap untuk digunakan ketika dibutuhkan. 7. Constructor dan Setter Injection Injection of Control ( IoC ) IoC adalah sebuah teknik dalam spring untuk melakukan IoC sering diidentikan dengan terminologi Holywood Don't IoC adalah sebuah teknik yang membuat programmer Java inversi terhadap kontrol. call us, because we will call you. Enterprise dapat memfokuskan diri kepada business logic mencari file XML dalam
Mengapa ioC penting ? Permasalahan 1 : hanya bergantung kepada tingkat penguasaan syntax pada bahasa pemrograman tertentu. Permasalahan 2: berarti kita akan tidak hanya menggunakan libarary atau fungsifungsi standar yang telah ada namun juga dari programmerprogrammer lain yang memiliki solusi dari permasalahan yang kita hadapi. Solusi : kode pemrograman adalah dengan IoC. T Tipe IoC:Dependency Injection(DI) Setter Injection Constructor Injection Setter Injection Konfigurasi dilakukan melalui JavaBean properties Properties yang harus ada dan merepresentasikan w writable(method setter) Properties yang optional dan merepresentasikan r readable(method getter) Penamaan dan konvensi yang terdapat pada spesifikasi JavaBeans contoh property roda yang akan menghasilkan Method getter getRoda Salah satu cara terbaik untuk mengatasi ketergantungan antar Pemrograman masa kini memiliki trend kolaborasi, yang juga Pemrograman masa kini semakin kompleks dan rumit dan tidak
10
Method setter setRoda public class LayananTaksi implements Taksi{ private ArgoTaksi argoTaksi; public void setArgoTaksi(ArgoTaksi argoTaksi){ this.argoTaksi=argoTaksi; } //diikuti method getter dan method yg merepresentasian bisnis } <bean id=taksi class=com.jeni.training.ioc.LayananTaksi> <property name=argoTaksi ref=argoTaksi/> <bean id=argoTaksi....... Constructor Injection Konfigurasi melalui argumen pada constructor Spring juga memperbolehkan setter injection setelah constructor dipanggil Untuk constructor java tidak melakukan ekspos nama argumen pada constructor, dan digantikan index Contoh : public class LayananTaksi implements Taksi{ private ArgoTaksi argoTaksi; private TipsTaksi tipsTaksi; public LayananTaksi(ArgoTaksi argoTaksi, TipsTaksi tipsTaksi) { this.argoTaksi=argoTaksi; this.tipsTaksi=tipsTaksi; } //diikuti dengan method yang merepresentasikan bisnis } <bean id=taksi class=com.jeni.training.ioc.LayananTaksi> <constructor-arg index=0 ref=argoTaksi/> <constructor-arg index=1 ref=tipsTaksi/> </bean>
11
PENUTUP
Spring diciptakan oleh Rod Johnson, disebabkan sebagai
penolakan komunitas dan developer mengenai spesifikasi pengembangan komponen java yaitu EJB yang mengharuskan pengembangan komponen mengikuti aturan EJB agar dapat berjalan dalam aplikasi server seperti SJAS dan JBoss. Pengembangan aplikasi saat ini yang bersifat skalabilitas, tersebar dan berorientasi objek, menuntut pembagian aplikasi tersebut kedalam komponen-komponen (modular) yang nantinya akan diintegrasikan antara satu dengan yg lainnya. Dalam pengembangan komponen ini dapat dilakukan dengan metode sederhana yaitu POJO. Spring berfungsi sebagai container dari komponen-komponen yang mengatur life-cycle dari komponen, dependensi sebuah komponen dan mekanisme lookup suatu komponen terhadap suatu sumberdaya. Dalam pembuatan suatu komponen, maka akan terjadi suatu ketergantungan antara komponen. Dalam hal ini Spring mengatur dependensi sebuah komponen melalui pendefinisiannya dalam Spring-IoC container (Dependency Injection). Pendefinisiannya dilakukan melalui 2 cara yaitu Constructor Injection dan Setter Injection. Dalam hal ini mekanisme terminologi Holywood Don't call us, because we will call you berlaku karena komponen tidak perlu melakukan lookup dependensi sendiri, namun diotomatisasi oleh Spring-IoC Container.
12
DAFTAR PUSTAKA
1. 2. 3. Spring in Action, Craig Walls and Ryan Breidenbach,Manning Beginning Spring 2: from novice to professional,Dave Minter, Appress http://www.ibm.com/developerworks/web/library/wa-spring1/TheSpring series, Part 1: Introduction to the Spring framework
13