SSH開發時,一般將項目分成3層:web層、service層和dao層。開發的基本流程是先定義dao接口,然后實現該接口,在定義同類型的service接口,再實現service接口(此時使用dao接口注入),接着再從web層去調用service層。
dao層完成的是底層的數據庫操作,service層則完成純粹的業務邏輯,該層中的數據操作部分是通過注入的dao層來實現的。service層的作用是將從dao層取得的數據做更貼近業務的實現,dao層則只實現對數據的增、刪、改、查操作。使用這種分層方式更有利於項目的擴展和維護。
一、設值注入
設值注入是指IoC容器使用setter方法注入被依賴的實例。通過調用無參構造器或無參static工廠方法實例化bean之后,調用該bean的setter方法,即可實現基於setter的DI。
- 新建項目,配置運行環境(Build Path中加入spring和其它依賴的jar包)
- User類,作為被保存的模型對象
package com.deciphering.model; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
- User類的接口UserDAO(針對接口編程的好處是UserDAO可以有多個不同的實現類,分別用來操作不同的數據庫)
package com.deciphering.dao; import com.deciphering.model.User; public interface UserDAO { public void save(User user); }
- UserDAO的實現類UserDAOImpl(簡化處理)
package com.deciphering.dao.impl; import com.deciphering.dao.UserDAO; import com.deciphering.model.User; public class UserDAOImpl implements UserDAO { public void save(User user) { System.out.println(user.getUsername() + " saved in Oracle!"); //System.out.println(user.getUsername() + " saved in DB2!"); //System.out.println(user.getUsername() + " saved in mysql!"); } }
- 業務邏輯接口UserService
package com.deciphering.service; import com.deciphering.dao.UserDAO; import com.deciphering.model.User; public class UserServiceImpl { private UserDAO userDAO; public void add(User user) { userDAO.save(user); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } /* public UserServiceImpl(UserDAO userDAO) { super(); this.userDAO = userDAO; } */ }
- 業務邏輯接口的實現類UserServiceImpl
package com.deciphering.service; import com.deciphering.dao.UserDAO; import com.deciphering.model.User; public class UserServiceImpl implements UserService{ private UserDAO userDAO; public void add(User user){ userDAO.save(user); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } }
- Spring的配置文件beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="u" class="com.deciphering.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="com.deciphering.service.UserServiceImpl"> <property name="userDAO"> <ref bean="u"/> </property> </bean> </beans>
- 測試類
Test
package com.deciphering.service; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.deciphering.model.User; import com.deciphering.service.UserServiceImpl; public class UserServiceTest { @Test public void testAdd() throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserServiceImpl service = (UserServiceImpl)ctx.getBean("userService"); User u = new User(); u.setUsername("測試用戶"); u.setPassword("123456"); service.add(u); } }
二、構造方法注入
構造方法注入是指IoC容器使用構造方法來注入被依賴的實例。基於構造器的DI通過調用帶參數的構造方法來實現,每個參數代表着一個依賴。
在上面的項目文件里,做少量的修改,即可變為構造方法注入。
- 修改UserServiceImpl類,在使用構造方法注入時,必須顯式的給出待參數的構造方法。
package com.deciphering.service; import com.deciphering.dao.UserDAO; import com.deciphering.model.User; public class UserServiceImpl { private UserDAO userDAO; public void add(User user) { userDAO.save(user); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } //定義構造方法 public UserServiceImpl(UserDAO userDAO) { super(); this.userDAO = userDAO; } }
- 修改beans.xml文件,加粗代碼為修改部分
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="u" class="com.deciphering.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="com.deciphering.service.UserServiceImpl"> <!-- <property name="userDAO"> <ref bean="u"/> </property> --> //使用構造方法注入,為UserService實例注入u實例 <constructor-arg> <ref bean="u"/> </constructor-arg> </bean> </beans>
文件結構: