深入浅出Spring(四)
我们分别介绍了一下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("");
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("");
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();
4、总结
对比上面的三张类图,我们可以看到,使用Spring框架, 将对象之间的依赖关系交由Spring容器进行控制,通过使用XML文件将对象之间的调用关系从代码中分离,避免硬编码所造成的过度程序耦合,这正是Spring框架实现解耦的核心思想。
到此为止,关于Spring的实例就讲解完毕了,讲解的不是很细,大家只需要对Spring框架有一个初步的认识即可。至于Spring运行过程中的具体实现,我会在下次的博文中继续讲解,以便加深大家对Spring的理解。
深入浅出Spring(四)的更多相关文章
- 转:深入浅出spring IOC中四种依赖注入方式
转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...
- 深入浅出Spring(四) Spring实例分析
上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...
- [置顶] 深入浅出Spring(四) Spring实例分析
上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP.接下来我们来做一个Sprin ...
- 深入浅出Spring(五) SpringMVC
上一篇深入浅出Spring(四) Spring实例分析的博文中,咱们已经可以了解Spring框架的运行原理和实现过程,接下来咱们继续讲解Spring的一个延伸产品——Spring MVC 1.Spri ...
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...
- [MVC] 深入浅出Spring MVC
[MVC] 深入浅出Spring MVC 转:http://4925054.blog.51cto.com/4915054/1176855 Spring MVC主要包括以下要点: 1:由Dispatch ...
- [置顶] 深入浅出Spring(三) AOP详解
上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...
- 深入浅出 JMS(四) - ActiveMQ 消息存储
深入浅出 JMS(四) - ActiveMQ 消息存储 一.消息的存储方式 ActiveMQ 支持 JMS 规范中的持久化消息与非持久化消息 持久化消息通常用于不管是否消费者在线,它们都会保证消息会被 ...
- 深入浅出Spring(三) AOP详解
上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...
随机推荐
- Dubbo与Kubernetes集成
Dubbo应用迁移到docker的问题 Dubbo是阿里开源的一套服务治理与rpc框架,服务的提供者通过zookeeper把自己的服务发布上去,然后服务调用方通过zk获取服务的ip和端口,dubbo客 ...
- Shiro笔记---身份验证
1.shiro有哪些主要功能 2.搭建shiro环境(*) idea2018.2.maven3.5.4.jdk1.8 项目结构: pom.xml: <dependencies> < ...
- 《Effective Java》 读书笔记(二) 在构造参数过多的时候优先考虑使用构造器
刚开始看见这个标题的时候,我想到了python可以选择初始化参数的语法,C++.C#能有默认参数. 为什么Java什么都没有~~ 好吧,我们是使用构造器来实现它. 1.当一个类的构造函数需要很多构造函 ...
- Linux基于webRTC的二次开发(一)
最近在做Linux平台下webRTC的二次开发,一路摸索,中间踩了不少坑,这一篇博客先来简单介绍下Linux上如何使用GCC编译webRTC. 为什么使用GCC编译? 这其实是无奈之举,Linux下w ...
- Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...
- 用Java实现简单的区块链
用 Java 实现简单的区块链 1. 概述 本文中,我们将学习区块链技术的基本概念.也将根据概念使用 Java 来实现一个基本的应用程序. 进一步,我们将讨论一些先进的概念以及该技术的实际应用. 2. ...
- 「Luogu 1525」关押罪犯
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...
- numpy---python数据分析
最后大图可点开保存 文章目录 最后大图可点开保存 学习目标 3.1.1Numpy介绍 3.1.2 ndarray介绍 3.1.3 ndarray与Python原生list运算效率对比 3.1.4 nd ...
- haproxy+keepalived练习
小的网站结构 说明:如果部署在云上,比如阿里云上,不需要自己部署keepalived,直接买阿里云的slb即可,slb然后分发流量到两台haproxy机器 一.先部署两个web服务器 编译安装ngin ...
- 4、Vim编辑器与正则表达式-面试题
题目 自己写答案