Setelah memahami konsep dari dependency injection dan spring inversion of control container, sekarang kita akan membahas mengenai bean dan component. Seperti yang sudah dibahas pada artikel sebelumnya, bean disini artinya merupakan sebuah object yang digunakan dalam aplikasi yang kita buat dan yang dimanaged oleh Spring IoC Container. Sebelumnya kita sudah mencoba untuk melihat bean yang terdapat pada container. Sekarang kita akan mencoba menambahkan bean pada container yang kita miliki. Semisal kita tambahkan class MessageBean
public class MessageBean { private String text; public MessageBean(String text) { this.text = text; } public String getText() { return text; } public void setText(String text) { this.text = text; } }
Untuk menambahkan bean MessageBean, kita akan menambahkan method pada Application class yang bertugas menginisialisasi object MessageBean. Contohnya sebagai berikut,
@Bean public MessageBean initMessageBean(){ MessageBean message = new MessageBean("Hello MessageBean"); return message; }
Dengan tambahan annotation @Bean, maka spring akan menambahkan bean tersebut pada container. Untuk mendapatkan bean tersebut, kita bisa mendapatkannya melalui interface ApplicationContext yang merupakan representasi dari Spring Inversion of Control Container.
MessageBean message = applicationContext.getBean(MessageBean.class);
Lalu bagaimana jika kita ingin menambahkan bean dengan tipe data yang sama, langsung saja contohnya sebagai berikut,
@Bean(name = "MessageBean1") @Primary public MessageBean initMessageBean1(){ MessageBean message = new MessageBean("Hello MessageBean1"); return message; } @Bean(name = "MessageBean2") public MessageBean initMessageBean2(){ MessageBean message = new MessageBean("Hello MessageBean2"); return message; }
Lalu untuk mendapatkan bean tersebut dari container,kita dapat memanggilnya seperti ini,
MessageBean message1 = applicationContext.getBean("MessageBean1",MessageBean.class); MessageBean message2 = applicationContext.getBean("MessageBean2",MessageBean.class);
Dapat kita lihat saat ingin mendapatkan bean secara spesifik dengan tipe data yang sama kita menggunakan parameter dari nama bean tersebut. Selain itu saat mendeklarasikan bean tersebut terdapat annotation @Primary, dimana annotation tersebut berguna saat kita tidak menyertakan parameter dari nama bean yang akan kita ambil. Sebagai contoh saat kita memanggil bean dengan code
MessageBean message1 = applicationContext.getBean(MessageBean.class);
Object message1 akan berisi MessageBean1 karena kita sudah mendeklarasikan @Primary pada MessageBean1. Jika kita mendeklarasikan bean dengan tipe data yang sama, maka kita wajib mengunakan annotation @Primary pada salah satu bean, agar spring bisa memilih default bean yang akan diinject jika ada yang membutuhkan. Setelah kita bisa membuat bean, kita harus mengetahui scope dari bean yang kita buat. Secara default spring akan memilih scope singleton dari setiap bean yang kita buat. Artinya jika kita memanggil bean yang sama dalam container kita, maka kita hanya akan merujuk pada 1 object. Sebagai contoh,
MessageBean message1 = applicationContext.getBean("MessageBean1",MessageBean.class); System.out.println(message1.getText()); message1.setText("Hello MessageBean1 Baru"); MessageBean message3 = applicationContext.getBean("MessageBean1",MessageBean.class); System.out.println(message3.getText());
Saat kita mengisi object message1 dengan bean MessageBean1, maka jika kita print getText() akan mengasilkan “Hello MessageBean1” , lalu kita setText() dengan “Hello MessageBean1 Baru”. Setelah itu kita buat object baru message3 dan kita ambil bean MessageBean1. Jika kita print, maka akan menghasilkan “Hello MessageBean1 Baru”, maka terbukti jika bean yang kita buat memiliki scope singleton. Dalam spring framework sendiri banyak jenis scope yang bisa kita gunakan, tidak hanya singleton. Berikut scope yang bisa kita gunakan
-
singleton
merupakan sebuah scope yang mengakibatkan setiap bean hanya memiliki 1 instance per Spring IoC Container
-
prototype
merupakan sebuah scope yang mengakibatkan setiap bean akan membuat object yang baru setiap diinisialisasi
-
request
merupakan sebuah scope yang mengakibatkan setiap bean akan membuat object yang baru setiap HTTP request dilakukan.
-
session
merupakan sebuah scope yang mengakibatkan setiap bean akan membuat object yang baru setiap sebuah HTTP Session.
-
globalSession
merupakan sebuah scope yang mengakibatkan setiap bean akan membuat object yang baru setiap global HTTP Session.
-
application
merupakan sebuah scope yang mengakibatkan setiap bean akan membuat object yang baru setiap ServletContext.
-
websocket
merupakan sebuah scope yang mengakibatkan setiap bean akan membuat object yang baru setiap WebSocket.
Selain menggunakan annotation @Bean, kita juga bisa menggunakan annotation @Component untuk menambahkan bean ke dalam container. Sedikit berbeda dengan annotation @Bean, kita bisa langsung mendeklarasikan annotation @Component di class yang ingin kita tandai sebagai bean.
@Component public class MessageComponent { private final MessageBean messageBean; @Autowired public MessageComponent(MessageBean messageBean) { this.messageBean = messageBean; } public void printMessageBean(){ System.out.println(messageBean.getText()); } }
Dapat kita lihat pada contoh di atas, kita menandai MessageComponent dengan @Component, tinggal pada main class kita tambahkan annotation @ComponentScan agar spring bisa mendeteksi bean yang telah kita tandai dengan @Component. Selain itu kita juga mencoba menerapkan konsep dependency injection pada class MessageComponent. Pada constructor MessageComponent kita inject MessageBean dengan menambahkan annotation @Autowired , maka spring akan otomatis menginject MessageBean saat bean MessageComponent diinisialisasi. Annotation @Component sendiri sebenarnya merupakan bentuk umum atau general dari spring-managed component. Sebenarnya ada beberapa turunan atau annotation yang lebih spesifik untuk menandai sebuah class berdasarkan kegunaannya. Diantaranya
-
@Service
annotation yang berfungsi menandai sebuah component bahwa component tersebut merupakan sebuah service yang biasanya berisi code business logic dari aplikasi yang kita buat.
-
@Controller
annotation yang berfungsi menandai sebuah component bahwa component tersebut merupakan sebuah controller yang berguna dalam aplikasi web dalam menghandle request yang diakses melalui url.
-
@Repository
annotation yang berfungsi menandai sebuah component bahwa component tersebut merupakan sebuah repository yang berfungsi sebagai data access object yang menghubungkan aplikasi dengan database.
Itulah beberapa jenis turunan dari annotation @Component yang biasanya disebut dengan stereotype. Untuk source code contoh bisa dilihat di Tutorial spring framework releases 3.0
sumber :