以前写的代码

mapper层

public interface PersonMapper {
void selectPersonList();
}
public class PersonMapperImpl implements PersonMapper {
@Override
public void selectPersonList() {
System.out.println("PersonMapperImpl selectPersonList");
}
}

service层

public interface PersonService {
void selectPersonList();
}
public class PersonServiceImpl implements PersonService {

    private PersonMapper personMapper = new PersonMapperImpl;

    @Override
public void selectPersonList() {
personMapper.selectPersonList();
}
}

controller层

private PersonService personService = new PersonServiceImpl();

    public void selectPersonList(){
personService.selectPersonList();
}

可以发现的是代码耦合度非常的高,当我们修改PersonService的实现类需要修改多出代码,如何解决呢?

首先使用工厂模式创建对象

public class MyBeanFactory {
public static Object getBean(String beanName) {
if ("personService".equals(beanName)) {
return new PersonServiceImpl();
} else if ("personController".equals(beanName)) {
return new PersonController();
} else {
return new PersonMapperImpl();
}
}
}

mapper层

public interface PersonMapper {
void selectPersonList();
}
public class PersonMapperImpl implements PersonMapper {
@Override
public void selectPersonList() {
System.out.println("PersonMapperImpl selectPersonList");
}
}

service层

public interface PersonService {
void selectPersonList();
}
public class PersonServiceImpl implements PersonService {

    private PersonMapper personMapper =(PersonMapper) MyBeanFactory.getBean("personMapper");

    @Override
public void selectPersonList() {
personMapper.selectPersonList();
}
}

controller层

private PersonService personService = (PersonService) MyBeanFactory.getBean("personService");

    public void selectPersonList(){
personService.selectPersonList();
}

测试一下是可以达到效果的,但是还是存在代码耦合度高的问题

继续优化,我们把MyBeanFactory的创建bean方法修改一下

public static Object getBean(String clazzName) {
if (clazzName != null) {
Object obj = null;
try {
obj = Class.forName(clazzName).newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}

mapper层

public interface PersonMapper {
void selectPersonList();
}
public class PersonMapperImpl implements PersonMapper {
@Override
public void selectPersonList() {
System.out.println("PersonMapperImpl selectPersonList");
}
}

service层

public interface PersonService {
void selectPersonList();
}
public class PersonServiceImpl implements PersonService {

    private PersonMapper personMapper =(PersonMapper) MyBeanFactory.getBean("com.qbb.spring.mapper.impl.PersonMapperImpl");

    @Override
public void selectPersonList() {
personMapper.selectPersonList();
}
}

controller层

private PersonService personService = (PersonService) MyBeanFactory.getBean("com.qbb.spring.service.impl.PersonServiceImpl");

    public void selectPersonList(){
personService.selectPersonList();
}

此时我们传递的是权限定类名,降低了一些代码耦合度,但是又带来了字符串硬编码问题

继续优化,修改MyBeanFactory

    // 创建对象时就加载
public MyBeanFactory() {
parseXML();
} // 定义一个Map<String,Object>存储bean对象
private static Map<String, Object> map = new HashMap<>(); // 解决字符串硬编码
public void parseXML() {
// 创建解析XML对象
SAXReader saxReader = new SAXReader();
InputStream is = MyBeanFactory.class.getClassLoader().getResourceAsStream("MyBean.xml");
try {
// 读取配置文件
Document docment = saxReader.read(is);
// 获取跟标签
Element rootElement = docment.getRootElement();
// 获取字标签
List<Element> elements = rootElement.elements();
for (Element element : elements) {
String id = element.attributeValue("id");
String clazz = element.attributeValue("class");
Object newInstance = Class.forName(clazz).newInstance();
map.put(id, newInstance);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取bean
public static Object getBean(String id) {
return map.get(id);
}

使用传统的三层架构出现的问题.引入Spring底层实现原理来解决(工厂模式+反射+XML配置文件/注解)的更多相关文章

  1. 4、传统三层架构与DDD分层架构

    4.传统三层架构与DDD分层架构 模型是抽象的 现实是形象的 技巧是重要的 思想是永恒的 从传统三层架构与DDD分层架构的编程演变其实是思想的演变. 传统三层架构,即用户界面层UI.业务逻辑层BAL. ...

  2. jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)

    经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传统的三层架构! 一共可以分为4个层: 模型层(可有可无),客户端,服务端, ...

  3. 基于EF+WCF的通用三层架构及解析

    分享基于EF+WCF的通用三层架构及解析 本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务 ...

  4. 从MVC和三层架构说到SSH整合开发

    相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println( ...

  5. 分享基于EF+WCF的通用三层架构及解析

    本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: ...

  6. (转)浅析三层架构与MVC模式的区别

    MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据 ...

  7. SSH和三层架构的MVC模式的对应关系

    1.MVC(Model-View-Controller)设计模式: 首先让我们了解下MVC(Model-View-Controller)的概念: MVC全名是Model View Controller ...

  8. 浅析MVC模式与三层架构的区别01

    三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层)三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI ...

  9. MVC模式与三层架构的区别

    之前总是混淆MVC表现模式和三层架构模式,为此记录下. 三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层) 三层架构(3-tier application) ...

随机推荐

  1. 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)

    邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...

  2. Solon 开发,三、构建一个Bean的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  3. leetcode 264. 丑数 II 及 313. 超级丑数

    264. 丑数 II 题目描述 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, ...

  4. 干货 | Dart 并发机制详解

    Dart 通过 async-await.isolate 以及一些异步类型概念 (例如 Future 和 Stream) 支持了并发代码编程.本篇文章会对 async-await.Future 和 St ...

  5. JavaScript 中BOM的常用操作

    JavaScript BOM操作 1.获取浏览器窗口尺寸 var width=window,innerWidth //获取可视窗口宽度 var height=window.innerHeight // ...

  6. Maven 框架结构知识总结

    1.maven目录结构 目录 内容 ${basedir} 存放pom.xml和所有子目录 ${basedir}/src/main/java 项目Java代码 ${basedir}/src/main/r ...

  7. 【笔记】论文阅读:《Gorilla: 一个快速, 可扩展的, 内存式时序数据库》

    英文:Gorilla: A fast, scalable, in-memory time series database 中文:Gorilla: 一个快速, 可扩展的, 内存式时序数据库

  8. 【记录一个问题】cuda核函数可能存在栈溢出,导致main()函数退出后程序卡死30秒CUDA

    调试一个CUDA核函数过程中发现一个奇怪的问题:调用某个核函数,程序耗时33秒,并且主要时间是main()函数结束后的33秒:而注释掉此核函数,程序执行不到1秒. 由此可见,可能是某种栈溢出,导致了程 ...

  9. 事务与一致性:刚性or柔性

    转发自 https://cloud.tencent.com/developer/article/1038871 在高并发场景下,分布式储存和处理已经是常用手段.但分布式的结构势必会带来"不一 ...

  10. 很详细的FFT(快速傅里叶变换)概念与实现

    FFT 首先要说明一个误区,很多人认为FFT只是用来处理多项式乘的,其实FFT是用来实现多项式的系数表示法和点值表示法的快速转换的,所以FFT的用处远不止多项式乘. FFT的前置知识:点值表示法,复数 ...