1. 程式人生 > >JavaEE框架---Spring---IoC/DI小例子

JavaEE框架---Spring---IoC/DI小例子

本例採用模擬客戶端登入業務提現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原則。