JavaEE框架---Spring---IoC/DI小例子
阿新 • • 發佈:2019-02-14
本例採用模擬客戶端登入業務提現IoC/DI的核心功能:解耦
演示程式碼包結構,見下圖:
v2.xml是容器的配置檔案
可以通過修改id='ser1'bean中的dao屬性值,不用修改程式碼就可實現切換資料庫。從這裡可以看出Spring IoC技術的強大。
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context.xsd "> <!-- 如果該 bean 不被別的物件 引用(ref) 可以不設定 id --> <bean id="login" class="cn.hncu.ioc.v2.LoginAction"> <!-- 注入基本資料型別和String的方式 --> <!-- property是根據類反射根據name進行推測呼叫相應的set方法進行值的注入 --> <property name="username" value="Tom"></property> <property name="password" value="1234"/> <!-- 簡單的注入值可以自封閉 --> <!-- 注入物件的方式 --> <property name="service" ref="ser1"></property> </bean> <!-- 該bean 被別的 物件引用了 所以必須設定 id --> <bean id="ser1" class="cn.hncu.ioc.v2.service.LoginServiceImpl"> <!-- 注入物件的方式 --> <property name="dao" ref="dao2"></property> </bean> <!-- 該bean 被別的 物件引用了 所以必須設定 id --> <bean name="dao1" class="cn.hncu.ioc.v2.dao.LoginDaoMySql"></bean> <!-- 該bean 被別的 物件引用了 所以必須設定 id --> <bean name="dao2" class="cn.hncu.ioc.v2.dao.LoginDaoOracle"></bean> </beans>
模擬客戶端
按理使用者名稱和密碼是通過user進行設定,這裡為順便演示如何配置bean和使用bean,就在xml中初始化user了。
package cn.hncu.ioc.v2; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /* * 客戶端,呼叫後臺 登入 業務 */ public class Client { public static void main(String[] args) { // 1載入容器 讀取 當前包中的xml檔案 ApplicationContext appCtx = new ClassPathXmlApplicationContext("cn/hncu/ioc/v2/v2.xml"); //獲取一個 處理 登入的 Action LoginAction loginAction = appCtx.getBean(LoginAction.class); //執行業務方法 loginAction.execute(); /* 修改 v2.xml檔案中 ser1中'dao'的 ref值為 dao2, * 就可把訪問的資料庫改成Oracle,而不用改任何程式碼。 * IoC/DI 最強大的功能就是 "解耦" !!! */ ((AbstractApplicationContext) appCtx).close(); } }
模擬後臺
客戶端通過呼叫後臺的execute方法來處理登入業務。這裡假設:"處理登入業務非常複雜,需要service層進行事務處理,但是service的還沒開發,使用Spring框架時就不用等service層開發出來再進行對接,使用Spring框架只要面向介面程式設計+DI(依賴注入)即可開發"。
package cn.hncu.ioc.v2; import cn.hncu.ioc.v2.service.ILoginService; public class LoginAction { //注入service private ILoginService service; //採用 Spring 注入必須 寫上相應的setter/getter方法!!! public ILoginService getService() { return service; } public void setService(ILoginService service) { this.service = service; } private String username; private String password; public LoginAction() { } 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; } //業務方法 public String execute() { return service.login(username, password); } }
serivice介面
為演示就一個登入業務的方法
package cn.hncu.ioc.v2.service;
public interface ILoginService {
String login(String username,String password);
}
service介面的實現類
package cn.hncu.ioc.v2.service;
import cn.hncu.ioc.v2.dao.LoginDAO;
public class LoginServiceImpl implements ILoginService {
//注入 dao
private LoginDAO dao;
//採用 Spring 注入必須 寫上相應的setter/getter方法!!!
public LoginDAO getDao() {
return dao;
}
public void setDao(LoginDAO dao) {
this.dao = dao;
}
@Override
public String login(String username, String password) {
return dao.login(username, password);
}
}
DAO介面
採用面向介面程式設計+Spring框架的DI技術,介面實現修改配置檔案就可以修改訪問的是MySQL資料庫還是Oracle資料庫。根本不需要修改程式碼,大大的降低了耦合度。後期維護起來十分方便。
package cn.hncu.ioc.v2.dao;
public interface LoginDAO {
String login(String username,String password);
}
DAO介面的實現類:
MySQL資料庫實現類
package cn.hncu.ioc.v2.dao;
public class LoginDaoMySql implements LoginDAO {
@Override
public String login(String username, String password) {
System.out.println("進行MySql資料庫操作..."+username+","+password);
return "success";
}
}
Oracle資料庫實現類
package cn.hncu.ioc.v2.dao;
public class LoginDaoOracle implements LoginDAO {
@Override
public String login(String username, String password) {
System.out.println("進行Oracle資料庫操作..."+username+","+password);
return "success";
}
}
總結:
Spring框架是一個非常好的框架,它的IoC(控制反轉)技術可以大大的提高程式設計師的開發效率,每個人各負其責,面向介面程式設計,只要完成自己負責的模組即可。而且後期維護時,如果需要進行擴充套件只要再寫一個類,通過xml配置檔案進行修改需要擴充套件的模組就可以實現切換功能,非常的方便並且符合了開發時OCP原則。