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 PeoplePerhatikan 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
ezul
24/09/2010 at 06:30 (UTC 7)
wah mantab… jd pgn nyoba
[Reply]
Jayusman
07/01/2011 at 13:31 (UTC 7)
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:
January 7th, 2011 at 18:32
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]
guntur
25/01/2011 at 17:28 (UTC 7)
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:
January 26th, 2011 at 19:26
udah tambahin context component scan belum di xml nya?
[Reply]
Kusandriadi.com » [Java] Aplikasi Web Sederhana dengan SpringMVC part I
05/02/2011 at 01:03 (UTC 7)
[...] 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 [...]