[置顶] 深入浅出Spring(四) Spring实例分析
上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP。接下来我们来做一个Spring的实例。
为了更好的讲解Spring的相关内容,这次的博文会针对一个【添加用户】的实例,进行逐步的解剖和优化,再此过程中,细节内容大家不需要考虑,只需要加深对Spring的理解即可。
1、实例一
首先,我们来看一个没有使用任何Spring框架内容,比较单纯的添加用户的实例。先看一下相关的类图和实现代码,具体如下:
	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;
		}
	}
	public interface UserDao {
		public void addUser(User user);
	}
	public class UserDao4OracleImpl implements UserDao {
		@Override
		public void addUser(User user) {
			System.out.println("UserDao4OracleImpl.addUser() , username="+user.getUsername());
		}
	}
	public class UserDao4MySqlImpl implements UserDao {
		@Override
		public void addUser(User user) {
			System.out.println("UserDao4MySqlImpl.addUser()  , username="+user.getUsername());
		}
	}
	public interface UserManager {
		public void addUser(User user);
	}
	public class UserManagerImpl implements UserManager {
		@Override
		public void addUser(User user) {
			UserDao userDao = new UserDao4MySqlImpl();
			userDao.addUser(user);
		}
	}
	public class Client {
		public static void main(String[] args) {
			User user = new User();
			user.setUsername("张三");
			user.setPassword("123456");	
			UserManager userManager = new UserManagerImpl();
			userManager.addUser(user);
		}
	}	
分析上面的类图和代码中,我们可以很明显的看出: 在UserManagerImpl类的方法addUser中,UserManagerImpl调用了UserDao及其具体的实现类UserDao4MySqlImpl,这就不符合IoC模式中,将接口的具体实现类的控制权从调用类中分离转交给第三方决定的相关思想 ,所以我们需要在这里进行修改。(参考我们之间的IoC文章)。
2、实例二
针对实例一中不符合IoC思想的部分,我们进行相关修改,具体修改之后的相关类图和代码如下:
	public class UserManagerImpl implements UserManager {
		private UserDao userDao;
		public UserManagerImpl (UserDao userDao){
			this.UserDao = userDao;
		}
		@Override
		public void addUser(User user) {
			this.userDao.addUser(user);
		}
	}
	public class Client {
		public static void main(String[] args) {
			User user = new User();
			user.setUsername("张三");
			user.setPassword("123456");	
			UserDao userDao =  new UserDao4MySqlImpl();	
			UserManager userManager = new UserManagerImpl(userDao);
			userManager.addUser(user);
		}
	}
分析上面修改之后的类图和代码,我们发现,虽然我们将UserDao的控制权交给了Client,但在Client中却存在对UserDao及其相关实现类的依赖,这样对于Client来讲,Client类与UserDao类之间的耦合性反而不如我们之前写的代码低。如何优化呢?我们这里就不做太多的思考,直接使用Spring的相关内容即可。
3、实例三
对于实例二的问题,先来看一下我们使用Spring框架修改之后的相关类图,具体如下:
看完上面类图之后,我们对比于第一张类图,可以看出:这张图中类与类之间的相互依赖更少,耦合性更低。这正是我们使用Spring的好处,但这张类图的代码究竟是如何实现的呢?这就是接下来,我们需要重点看一下的Client类,具体的相关代码如下:
	public class Client {	
		public static void main(String[] args) {
			User user = new User();
			user.setUsername("张三");
			user.setPassword("123456");
			BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
			UserManager userManager = (UserManager)factory.getBean("userManager");
			userManager.addUser(user);
		}
	}
通过对比上面的代码和我们在第二个实例中关于Client类的代码可以看出,上面的代码仅仅用到了一个BeanFactory类和一个XML文件,而这也正是Spring框架使用的核心类和类与类之间耦合性降低的关键。了解了两者的区别,我们再看一下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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="userDao4MySqlImpl" class="com.zs.spring.dao.UserDao4MySqlImpl"/> <bean id="userManager" class="com.zs.spring.manager.UserManagerImpl">
<property name="userDao" ref="userDao4MySqlImpl"/>
</bean>
</beans>
关于这个XML文件,我会在接下来的文章中重点进行讲解,这里只告诉大家,它就 即相当于下面的两句代码:
UserManager userManager = new UserManagerImpl(userDao);
UserDao userDao = new UserDao4MySqlImpl();
4、总结
对比上面的三张类图,我们可以看到,使用Spring框架, 将对象之间的依赖关系交由Spring容器进行控制,通过使用XML文件将对象之间的调用关系从代码中分离,避免硬编码所造成的过度程序耦合,这正是Spring框架实现解耦的核心思想。
到此为止,关于Spring的实例就讲解完毕了,讲解的不是很细,大家只需要对Spring框架有一个初步的认识即可。至于Spring运行过程中的具体实现,我会在下次的博文中继续讲解,以便加深大家对Spring的理解。
给大家提供一个博文配套的参考实例代码下载地址:
[置顶] 深入浅出Spring(四) Spring实例分析的更多相关文章
- [置顶] 深入浅出Spring(一)Spring概述
		
现在很多的企业级项目中基本上都会用到了Spring框架,那么为什么会出现Spring,Spring是什么?这次的博文我主要为大家简单介绍一下Spring. Java EE优缺点 我们都知道在2003年 ...
 - [置顶] 深入浅出Spring(三) AOP详解
		
上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...
 - 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
		
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
 - [置顶] 如何使用c3p0+spring连接oracle数据库
		
1. 首先是jdbc.properties属性文件的编写,便于数据库移植: datasource.driverClassName=oracle.jdbc.driver.OracleDriver dat ...
 - [置顶] 深入浅出MongoDB(三)环境搭建
		
上次的博文深入浅出MongoDB(二)概述中我们已经将MongoDB的相关概念讲解了一下,接下来我们继续进行MongoDB学习.在学习之前,大家首先需要在自己的电脑上安装MongoDB. 1.安装 安 ...
 - [置顶] PMBOOK第四版-ITO与数据流图总结
		
具体文档下载地址: 点击打开文档下载地址 :http://download.csdn.net/detail/lyjluandy/6694205 一.过程组与知识领域表(简图) 二.输入 - 工具 - ...
 - [置顶] Firefox OS 学习——Gaia 编译分析
		
Gaia作为用户的接口,也是用户可见部分,一些用户的应用也是安装在这一层,所以研究他是很有必要的,对于像我这样的初学者,最直接的学习方法就是通过修改代码,然后可以看到UI的变化,很直观的观察修改结果. ...
 - [置顶] Android开发之Thread类分析
		
在我们Linux系统中创建线程函数为:pthread_create(),在Android中我们为线程封装了一个类Thread,实际调用的还是pthread_create() 当我们想创建线程的时候,只 ...
 - 精尽Spring MVC源码分析 - HandlerMapping 组件(四)之 AbstractUrlHandlerMapping
		
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
 
随机推荐
- CSS 笔记——阴影、圆角、旋转、光标
			
7. 阴影.圆角.旋转.光标 (1)box-shadow 阴影 基本语法 text-shadow: h-shadow v-shadow blur color; box-shadow: h-shadow ...
 - 我的OI生涯 第一章
			
第一章 一入电竞深似海 我叫WZY,是TSYZ的一名学生. 2016年7月10日,我进了一个叫做oi的坑. 那时的我不知道什么叫竞赛,不知道什么叫编程,不知道什么是c++. 就记得前一天我特意去图 ...
 - [BZOJ3676][APIO2014]回文串(Manacher+SAM)
			
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 3097 Solved: 1408[Submit][Statu ...
 - 2017-2018-1 JAVA实验站 第四、五周作业
			
2017-2018-1 JAVA实验站 第四.五周作业 JAVA实验站小组成员 学号 名字 职务 20162318 张泰毓 组长 20162303 石亚鑫 组员 20162304 张浩林 组员 201 ...
 - bzoj 1598: [Usaco2008 Mar]牛跑步  -- 第k短路,A*
			
1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec Memory Limit: 162 MB Description BESSIE准备用从牛棚跑到池塘的方法来锻炼 ...
 - 14. Cantor表
			
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数 ...
 - python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory
			
python3.5安装报错 python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open sha ...
 - VK Cup 2016 - Qualification Round 1 (Russian-Speaking Only, for VK Cup teams) B. Chat Order 水题
			
B. Chat Order 题目连接: http://www.codeforces.com/contest/637/problem/B Description Polycarp is a big lo ...
 - Unity  Pivot/Center与Local/Global总结
			
Untiy左上角有两个按钮 Pivot/Center 和 Local/Global 它们叫做 变换Gizmo工具 Pivot/Center:现实游戏对象的轴心参考点.Center为以所有选中物体所 ...
 - [转]MinGW编译wxWidgets问题
			
其实利用MinGW编译wxWidgets是一件挺简单的事情,但是最近在编译的时候遇到一些问题,并找到解决方案,因此在此分享一下个人经验.编译出错的原因是由于安装了MSYS的缘故. 错误信息类似于如 ...