本例采用模拟客户端登录业务提现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原则。