«

»

Jun 23

[Java] Mengenal Spring Framework : Dependency Injection

Spring merupakan salah satu framework DI yang cukup populer dan banyak digunakan oleh developer Java sekarang ini. Bahkan saya pernah membaca salah satu thread di Java User Group Indonesia bahwa Spring dan Hibernate sudah menjadi standar untuk membuat aplikasi dengan Java. Mengapa kita harus belajar Spring? tentunya “ikut-ikutan teman” adalah jawaban yang kurang bisa di terima, hehe….Ada banyak teknologi yang diadopsi oleh Spring, tapi core dari Spring adalah DI atau IOC yang benar-benar memudahkan kita untuk membangun sebuah aplikasi, membuat code kita menjadi lebih rapih dan lebih simple, kita tidak perlu lagi menginisialisasi sebuah object, karena nantinya akan di load oleh Spring yang tentu saja sudah kita siapkan di XML, tapi dalam beberapa kasus, memang tidak semua object harus kita siapkan di Spring Container. Sebenarnya framework seperti Struts2 dan JSF juga menerapkan IOC, tapi kedua framework tersebut dikhususkan untuk Java Enterprise, yang tentu saja membuat pasar mereka tidak seluas Spring.

Spring sampai saat ini sudah mencapai versi 3.0, tidak ada lagi alasan eneg melihat XML ratusan baris karena sudah menerapkan anotasi yang membuat Spring terlihat sangat simple sekali. Berikut contoh simple nya, pertama-tama kita buat dulu sebuah kelas entity bernama People seperti ini :

public class People {
 
    private String nim;
 
    private String nama;
 
    public String getNim() {
        return nim;
    }
 
    public void setNim(String nim) {
        this.nim = nim;
    }
 
    public String getNama() {
        return nama;
    }
 
    public void setNama(String nama) {
        this.nama = nama;
    }
}

Kelas People adalah sebuah kelas entity biasa dengan variabel nim dan nama bertipe String, jangan lupa untuk membuat getter dan setter nya. Setelah itu kita buat file Spring-ctx.xml seperti dibawah ini :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<bean id="people">
<property name="nim" value="0811503721" />
<property name="nama" value="Kus Andriadi" />
</bean>
</beans>

 

pada contoh spring-ctx diatas, kita membuat bean bernama people yang kita rujuk pada class People, disitu ada tag property yang mempunyai atribut nim dan nama, kita juga sudah menyiapkan value dari masing-masing property, value ini lah yang nantinya akan diinject ke dalam program kita oleh Spring. Adapun nama property tersebut adalah variabel yang telah kita siapkan pada kelas People sebelumnya, setelah itu buatlah kelas BelajarSpring sebagai kelas main seperti ini :

public class BelajarSpring {
 
    private static ApplicationContext applicationContext;
 
    public static void main(String[] args) {
        People people = new People();
 
        //cetak
        System.out.println("Nim : " + people.getNim());
        System.out.println("Nama : " + people.getNama());
 
    }
}

Lalu jalankan program diatas, apa yang tercetak? program diatas akan menghasilkan keluaran seperti ini :

Nim : null
 
Nama : null

Mengapa bisa null? Karena variabel yang telah kita siapkan pada kelas People, belum di inisialisasi, sehingga ketika dicetak akan menghasilkan null, pada beberapa contoh lain akan menghasilkan NullPointerException, sekarang mari kita ubah sedikit kelas BelajarSpring diatas menjadi seperti ini :

public static void main(String[] args) {
    applicationContext = new ClassPathXmlApplicationContext("/com/kusandriadi/conf/spring-ctx.xml");
    People people = (People) applicationContext.getBean("people");
 
    //cetak
    System.out.println("Nim : " + people.getNim());
    System.out.println("Nama : " + people.getNama());
}

Lalu jalankan, dan akan mempunyai keluaran seperti ini :

  1. Jun 23, 2010 2:40:32 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2.  
  3. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@be2358: startup date [Wed Jun 23 02:40:32 ICT 2010]; root of context hierarchy
  4.  
  5. Jun 23, 2010 2:40:32 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  6.  
  7. INFO: Loading XML bean definitions from class path resource [com/kusandriadi/conf/spring-ctx.xml]
  8.  
  9. Jun 23, 2010 2:40:32 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  10.  
  11. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1125127: defining beans [people]; root of factory hierarchy
  12.  
  13. Nim : 0811503721
  14. Nama : Kus Andriadi

Lihat pada baris 13 dan 14, nim dan nama sudah terinisialisasi dan tercetak dengan benar, adapun value tersebut telah diinject oleh spring karena sudah kita siapkan sebelumnya pada Spring Context. Bagaimana? tidak terlalu sulit bukan? ini hanyalah contoh kecil dari Spring, manfaat kita menggunakan Spring akan lebih terasa jika kita membangun aplikasi yang agak besar dan juga sudah bisa menggabungkan dengan Hibernate atau Ibatis (baca : Framework ORM kesayangan anda,huahaha…)

Regards

11 comments

1 ping

  1. enss

    Kak, xml itu apa? Lalu file Spring-ctx.xml di atas berfungsi untuk apa?

    Mohon pencerahan.. hehe :D

    [Reply]

    Kus Andriadi Reply:

    Spring Ctx itu Spring context, gimana yah..susah jelasinnya :P

    [Reply]

  2. Jayusman

    Mas kus,, klo pake anotation juga spring juga… masih bisa dipake gak dalam waktu program di jalankan???

    [Reply]

    Kus Andriadi Reply:

    maksudnya?

    [Reply]

  3. chabi

    om kus,ada tutorial java dari yg simpel2 gak..
    dari yg bisa simpan,ubah,hapus n laporan..
    nnt baru framework nya..
    trims ya om…

    [Reply]

    Kus Andriadi Reply:

    wah gak ada :D saya biasanya kalo kaya gitu cari2 aja di google banyak :D

    [Reply]

  4. bahrie

    mas, saya mraktekkin persis yg mas buat kq error ya..

    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@145f0e3: defining beans [people]; root of factory hierarchy
    Apr 21, 2011 5:28:30 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
    INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@145f0e3: defining beans [people]; root of factory hierarchy
    Exception in thread “main” org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘people’ defined in class path resource [bahri/latihan/spring-ctx.xml]: Instantiation of bean failed; nested exception is java.lang.IllegalStateException: No bean class specified on bean definition
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:955)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:901)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
    at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)
    at bahri.latihan.TestSpring.main(TestSpring.java:22)

    yang kurang apanya??

    baris ke 22 :

    applicationContext=new ClassPathXmlApplicationContext(“/bahri/latihan/spring-ctx.xml”);

    mohon pencerahannya.. :D

    saya pake library bawaan netbeans. Spring Framework 3.0.2

    [Reply]

    Kus Andriadi Reply:

    udah di ym ya :)

    [Reply]

  5. Daniel

    mas,, biasa spring dipakai pada saat apa?? bukankah biasa bean harus nya nilai nya dinamik?? kalau seperti contoh diatas seperti nya nilainya menjadi static…

    [Reply]

    Kus Andriadi Reply:

    bisa static, bisa dynamic….kalau kita ingin menggabungkan nya dengan hibernate misal, itu sessionfactory nya juga static kan? :D

    contoh yang dynamic…

    GenericApplicationContext genericApplicationContext = new GenericApplicationContext();
    BeanDefinitionBuilder bdb = BeanDefinitionBuilder.rootBeanDefinition(People.class);
    bdb.addPropertyValue(“nim”, “0811503721″);
    genericApplicationContext.registerBeanDefinition(“peopleAh”, bdb.getBeanDefinition());
    People people1 = (People) genericApplicationContext.getBean(“peopleAh”);
    System.out.println(“Nim : ” + people1.getNim());

    jadi memang tergantung kebutuhan aja :D

    [Reply]

  6. Geralvin

    mas mau tanya.. itu kan value nya masih static..

    kalo dynamic gmn ya? sbenernya masih agak bingung sama konsek Dependency injection ini..

    [Reply]

  1. KusAndriadi.com » [Java] Mengenal Spring Framework : Reference Injection

    [...] yang saya berikan tidak akan terlalu jauh berbeda dari contoh sebelumnya disini, Jadi saya sarankan anda membaca terlebih dahulu artikel saya tersebut agar anda mempunyai sedikit [...]

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Get Adobe Flash playerPlugin by wpburn.com wordpress themes