Kusandriadi.com I Just Want to Share

[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;

 /**
 * @param args
 */
 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" class="com.kusandriadi.entity.People" />
<bean id="police" class="com.kusandriadi.entity.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

Leave a Reply

CommentLuv Enabled

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

Get Adobe Flash playerPlugin by wpburn.com wordpress themes