Ini lanjutan dari blog saya yang kemarin tentang Integrasi Struts2 dengan Spring Framework, dan yang ingin saya sharing kali ini gak akan jauh berbeda dari topik kemarin, yaitu tentang salah satu fitur dari Spring Framework yang sudah ada sejak versi 2.5 yaitu annotation. Dalam hal ini saya akan mencontohkan bagaimana melakukan autowiring terhadap DataSource (gak jauh dari yang kemarin, cuma ganti jadi anotasi doank). Kali ini saya membuat kasus (lohloh bikin kasus) dimana saya memiliki sebuah Data Access Object (DAO) untuk melakukan transaksi database, dan DAO ini membutuhkan DataSource untuk dapat melakukan tugasnya yang akan digunakan oleh Controller untuk menyampaikannya kepada Viewer Layer. Hehehehe?. Saya juga bingung gimana menggambarkannya. Langsung berangkat ke TKP. Berikut sedikit modifikasi dari applicationContext-jdbc.xml
1: <?xml version="1.0" encoding="UTF-8"?>2: <beans xmlns="http://www.springframework.org/schema/beans"3: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"4: xmlns:p="http://www.springframework.org/schema/p"5: xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd6: http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
7:8: <context:component-scan base-package="com.mervpolis.dwx" />9:10: <bean id="dataSource"11: class="org.springframework.jdbc.datasource.DriverManagerDataSource"12: p:driverClassName="com.mysql.jdbc.Driver" p:username="root"13: p:password="admin" p:url="jdbc:mysql://localhost:3306/test" />14:15: </beans>
Nah ada satu baris mantra yang ditambahkan di situ yang berfungsi untuk melakukan scan terhadap semua class yang mengandung anotasi seperti @Autowired @Service @Component dll. ItemDao.java
1: package com.mervpolis.dwx.struts2spring.dao;
2:3: import java.sql.ResultSet;
4:5: public interface ItemDao {6: void saveItem(String name, String price);
7:8: ResultSet getAllItems();9: }
Berikut implementasinya
1: package com.mervpolis.dwx.struts2spring.dao;
2:3: import java.sql.Connection;
4: import java.sql.PreparedStatement;
5: import java.sql.ResultSet;
6: import java.sql.SQLException;
7:8: import javax.sql.DataSource;
9:10: import org.springframework.beans.factory.annotation.Autowired;
11: import org.springframework.stereotype.Service;
12:13: /**
14: * Sama dengan15: * <code><bean id="itemDao" class="com.mervpolis.dwx.struts2spring.dao.ItemDaoImpl"></code>16: *17: */18: @Service19: public class ItemDaoImpl implements ItemDao {20:21: /**
22: * Nah setternya diganti dengan yang satu ini23: */24: @Autowired25: private DataSource dataSource;
26:27: public void saveItem(String name, String price) {28: try {
29: Connection connection = dataSource.getConnection();30:31: String sql = "INSERT INTO item (name, price) VALUES (?, ?)";
32: PreparedStatement statement = connection.prepareStatement(sql);33: statement.setString(1, name);34: statement.setString(2, price);35:36: statement.executeUpdate();37: } catch (SQLException e) {
38: e.printStackTrace();39: }40: }41:42: public ResultSet getAllItems() {
43: try {
44: Connection connection = dataSource.getConnection();45:46: ResultSet resultSet = connection.prepareStatement(47: "SELECT * FROM item").executeQuery();
48:49: return resultSet;
50: } catch (SQLException e) {
51: e.printStackTrace();52:53: return null;54: }55: }56:57: }58:
Sudah mulai terlihat bedanya, untuk melakukan injection sudah tidak menggunakan setter lagi, tetapi dengan menggunakan @Autowired, sedangkan untuk pembuatan bean-nya digunakan @Service. Sekarang tingga; menyuntikkan DAOnya ke controller
1: package com.mervpolis.dwx.struts2spring.action;
2:3: import java.sql.Connection;
4: import java.sql.ResultSet;
5: import java.util.ArrayList;
6: import java.util.HashMap;
7: import java.util.List;
8: import java.util.Map;
9:10: import javax.sql.DataSource;
11:12: import org.apache.struts2.convention.annotation.Action;
13: import org.apache.struts2.convention.annotation.Result;
14: import org.apache.struts2.convention.annotation.Results;
15: import org.springframework.beans.factory.annotation.Autowired;
16:17: import com.mervpolis.dwx.struts2spring.dao.ItemDao;
18: import com.mervpolis.dwx.struts2spring.datasource.DataSourceAware;
19: import com.opensymphony.xwork2.ActionSupport;
20:21: /**
22: * @author Dian Aditya23: *24: */25: @Results({ @Result(name = ActionSupport.SUCCESS, type = "velocity", location = "/view/item/item_list.vm") })26: public class ItemController extends ActionSupport {27:28: private List result = new ArrayList();29: private String id;
30:31: /**
32: * Inject lagi33: */34: @Autowired35: private ItemDao itemDao;
36:37: @Action("/item/show")
38: public String show() throws Exception {39: if (itemDao == null) {40: addActionError("Gagal menyuntik itemDao");
41: } else {
42: ResultSet resultSet = itemDao.getAllItems();43: while (resultSet.next()) {
44: Map data = new HashMap();
45: data.put("name", resultSet.getString("name"));46: data.put("price", resultSet.getString("price"));47: result.add(data);48: }49: }50:51: return SUCCESS;
52: }53:54: public String getId() {
55: return id;
56: }57:58: public void setId(String id) {59: this.id = id;
60: }61:62: public List getResult() {
63: return result;
64: }65: }66:
Dan coba dijalankan, hasilnya tidak akan jauh beda dari contoh sebelumnya. Sedikit bonus :p berikut contoh tanpa menggunakan anotasi.
1: <?xml version="1.0" encoding="UTF-8"?>2: <beans xmlns="http://www.springframework.org/schema/beans"3: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"4: xmlns:p="http://www.springframework.org/schema/p"5: xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd6: http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
7:8: <bean id="dataSource"9: class="org.springframework.jdbc.datasource.DriverManagerDataSource"10: p:driverClassName="com.mysql.jdbc.Driver" p:username="root"11: p:password="admin" p:url="jdbc:mysql://localhost:3306/test" />12:13: <bean id="itemDao" class="com.mervpolis.dwx.struts2spring.dao.ItemDaoImpl"14: p:dataSource-ref="dataSource" />15:16: </beans>
Atau secara sederhananya mungkin juga seperti ini. <p
1: // org.springframework.jdbc.datasource.DriverManagerDataSource
2: DriverManagerDataSource dataSource = new DriverManagerDataSource();
3: dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
4: dataSource.setUsername(“root”);
5: dataSource.setPassword(“admin”);
6: dataSource.setUrl(“jdbc:mysql://localhost:3306/test”);
7:8: // javax.sql.DataSource
9: DataSource source = dataSource;10:11: // com.mervpolis.dwx.struts2spring.dao.ItemDaoImpl
12: ItemDaoImpl daoImpl = new ItemDaoImpl();
13: daoImpl.setDataSource(source);14:15: // com.mervpolis.dwx.struts2spring.dao.ItemDao
16: ItemDao itemDao = daoImpl;Cape juga ternyata, selamat menikmati hidangannya. </p