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框架修改之后的相关类图,具体如下:
看完上面类图之后,我们对比于第一张类图,可以看出:类与类之间的相互依赖更少,这样的结构能够使我们的代码耦合性更低。但这张类图的代码究竟是如何实现的呢?接下来,重点看一下我们需要修改的目标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文件,我会在接下来的文章中重点进行讲解,这里只告诉大家,它的作用就是将对象之间的依赖关系交由Spring容器进行控制,避免硬编码所造成的过度程序耦合。即相当于下面的两句代码:
UserManager userManager = new UserManagerImpl(userDao);
UserDao userDao = new UserDao4MySqlImpl();
到此为止,关于Spring的实例就讲解完毕了,讲解的不是很细,大家只需要对Spring框架有一个初步的认识即可,下次我们继续讲解这次博文中确实的关于Spring运行过程的相关内容,以便加深大家对Spring的理解。
给大家提供一个博文配套的参考实例代码下载地址:
Spring实例的更多相关文章
- spring实例教程
1.配置好spring mvc发现访问无法匹配,很可能是文件放的位置或者相对目录不对. 2.实例大全:http://www.yiibai.com/spring/spring-collections-l ...
- 深入浅出Spring(四) Spring实例分析
上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...
- [置顶] 深入浅出Spring(四) Spring实例分析
上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...
- Redis + Jedis + Spring 实例(对象的操作)
目录(?)[+] 不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 一.预期 接上 ...
- spring实例入门
首先是bean文件: package onlyfun.caterpillar; public class HelloBean { private String helloWord = " ...
- spring 实例 bean 的方式
一.使用构造器实例化: <bean id="personService" class="cn.mytest.service.impl.PersonServiceBe ...
- spring实例化二:SimpleInstantiationStrategy
spring对类的实例化,定义了接口InstantiationStrategy,同时先做了个简单实现类SimpleInstantiationStrategy.采用实现部分,抽象部分的策 ...
- dubbo+zookeeper+spring实例
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- Struts2 + Spring + hibernate 框架搭成实例
1.准备Jar包: struts2.hibernate.spring所需jar包 struts-core-2.x.x.jar ----struts核心包 xwork-core-2.x.x.jar ...
随机推荐
- [转载]CSS元素的定位position
CSS元素的定位position 属性position 值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一 ...
- 只显示年月的js时间控件 纯手写
<style> #date { text-align: center; } .td { cursor: pointer; } </style> <script> f ...
- TDD(测试驱动开发)学习一:初识TDD
首先说一下名词解释,TDD,英文名称Test-Driven Development,中文名称测试驱动开发,简单的断下句“测试/驱动/开发”,简单的理解一下,就是测试驱动着开发,大白话就是说用一边测试一 ...
- 【转】Oracle修改表空间为自动扩展
1.数据文件自动扩展的好处1)不会出现因为没有剩余空间可以利用到数据无法写入2)尽量减少人为的维护3)可以用于重要级别不是很大的数据库中,如测试数据库等 2.数据文件自动扩展的弊端1)如果任其扩大,在 ...
- 第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...
- 快速构建Windows 8风格应用35-触控输入
原文:快速构建Windows 8风格应用35-触控输入 引用 Windows 8设备通常具有多点触摸屏,用户可以同时使用多个手指来进行不同的输入交互,如点击.拖动或收缩等手势操作.另外Windows ...
- vim的复制粘贴小结
vim帮助文档里与粘贴板有关的内容如下: vim有12个粘贴板,分别是0.1.2.….9.a.“.+:用:reg命令可以查看各个粘贴板里的内容.在vim中简单用y只是复制到“(双引号)粘贴板里,同样用 ...
- C#中抽象类和接口的区别
原文:C#中抽象类和接口的区别 大家在编程时都容易把抽象类和接口搞混,下面为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是 ...
- Bootstrap Paginator分页插件
Bootstrap Paginator分页插件使用示例 最近做的asp.netMVC项目中需要对数据列表进行分类,这个本来就是基于bootstrap开发的后台,因此也就想着bootstrap是否有分页 ...
- Repository在DDD中的应用
Repository在DDD中的应用2014-10-09 08:55 by Jesse Liu, 98 阅读, 0 评论, 收藏, 编辑 概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值 ...