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原则。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值