«

»

Jul 08

[Java] Mengenal Spring Framework : Reference Injection

Kali ini kita akan sedikit belajar tentang Reference Injection yang juga salah satu fitur dari Dependency Injection-nya Spring, contoh yang saya berikan kali ini menggunakan anotasi, tapi saya juga akan menjelaskan sedikit bagaimana caranya jika tidak menggunakan anotasi, tentunya jika kita menggunakan anotasi, code kita akan menjadi lebih simple dan XML pada spring context kita tidak terlalu bloated, jika kita sudah berbicara dengan ratusan atau bahkan ribuan baris code, ini membuat program kita akan lebih mudah di konfigurasi atau memudahkan kita jika ada perubahan-perubahan pada setiap baris code kita.

Contoh 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 gambaran tentang Dependency Injection. Oke langsung saja, buatlah sebuah class People kurang lebih seperti ini :

package com.kusandriadi.entity;
 
import org.springframework.stereotype.Repository;
 
@Repository("people")
public class People {
    private String messagePeople = "i’m People";
 
    public String getMessagePeople() {
        return messagePeople;
    }
 
    public void setMessagePeople(String messagePeople) {
        this.messagePeople = messagePeople;
    }
}

 

Kita membuat bean people dengan anotasi @Repository, ini adalah pengganti tag <bean /> pada Spring context, selanjutnya kita buat class Police yang kurang lebih isinya seperti ini :

package com.kusandriadi.entity;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
@Repository("police")
public class Police {
 
    @Autowired
    private People message;
 
    public People getMessage() {
        return message;
    }
 
    public void setMessage(People message) {
        this.message = message;
    }
}

 

Selanjutnya buatlah class main untuk menjalankan program, kurang lebih seperti ini :

package com.kusandriadi.main;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.kusandriadi.entity.Police;
 
public class BelajarSpring {
 
private static ApplicationContext applicationContext;
 
    public static void main(String[] args) {
        applicationContext = new ClassPathXmlApplicationContext("/com/kusandriadi/conf/spring-ctx.xml");
        Police police = (Police) applicationContext.getBean("police");
 
        //cetak
        System.out.println("Police said : " + police.getMessage().getMessagePeople());
    }
}

 

Oh ya, jangan lupa membuat spring context seperti 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">
<context:annotation-config/>
<context:component-scan base-package="com.kusandriadi" />
</beans>

 

Mudah sekali, kita hanya perlu menambahkan 2 baris pada spring context yaitu <context:annotation-config/> yang berfungsi agar spring bisa membaca anotasi dan <context:component-scan /> untuk memberitahu spring ada di package atau class mana anotasi tersebut. Jika kita membuat beans secara manual, isi dari spring context kurang lebih akan seperti ini :

<bean id="people" />
<bean id="police" >
<property="message" ref="people">
</bean>

Terlihat bedanya bukan? jika kita menggunakan anotasi, untuk membuat bean kita cukup menggunakan @Repository dan untuk reference cukup dengan @Autowired, pada suatu kasus, jika ada referensi yang sama, kita harus menambakan anotasi @Qualifier untuk memberitahu Spring lebih detail class atau Dao mana yang akan di jadikan reference, mungkin khusus untuk anotasi ini untuk lebih lengkap nya akan saya buat pada artikel terpisah. Sekarang kembali ke code program kita, jika sudah selesai mengikuti seluruh petunjuk diatas, sekarang coba jalankan program tersebut, seharusnya tidak ada error, dan program akan menghasilkan output seperti ini :

Jul 8, 2010 8:57:39 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@19c26f5: startup date [Thu Jul 08 08:57:39 ICT 2010]; root of context hierarchy
Jul 8, 2010 8:57:39 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [com/kusandriadi/conf/spring-ctx.xml]
Jul 8, 2010 8:57:39 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@107ebe1: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,people,police]; root of factory hierarchy
 
Police said : i'm People

Perhatikan output paling bawah, itulah output dari program kita, bagian atas hanyalah logging spring, bukan error program. Sekarang coba pada class Police hapus anotasi @Autowired, lalu jalankan kembali program tersebut, lalu apa yang terjadi? Program akan menghasilkan error NullPointerException karena object message pada class People belum di inisialisasi, Jadi sebenarnya konsep dari Dependency Injection di Spring sebenarnya sama saja, entah itu method, constructor atau pun setter injection.

Sampai disini dulu artikel saya ini,  sepertinya sudah terlalu panjang, kritik dan saran welcome….:)

Regards

5 comments

1 ping

  1. ezul

    wah mantab… jd pgn nyoba

    [Reply]

  2. Jayusman

    Mas kus mau nanya lgi,, fungsi darii @Repository(“police”) maksudnya untuk apa ya..?? truss sama @Autowired fungsi nya untuk apa???

    Makasih mas..

    [Reply]

    Kus Andriadi Reply:

    gampangnya yah…repository itu buat bikin bean, kan kalo di xml kita ada nah kalo anotasi cukup @Repository(“police”)…autowired buat reference, coba ubek2 artikel saya tentang spring dibelakang, ada artikel khusus tentang reference di spring :)

    [Reply]

  3. guntur

    Error Mas,
    Exception in thread “main” org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘police’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field

    [Reply]

    Kus Andriadi Reply:

    udah tambahin context component scan belum di xml nya?

    [Reply]

  1. Kusandriadi.com » [Java] Aplikasi Web Sederhana dengan SpringMVC part I

    [...] di tentukan request tersebut bermethod POST atau GET, untuk @Autowired lebih jelasnya bisa dilihat disini, @ModelAttribute digunakan untuk mengambil isi dari suatu object, dalam hal ini adalah object [...]

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