以前写的代码

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. 以太 ip tcp udp 三次握手的理解

    以太帧: 1.前导码(7字节):使接收器建立比特同步. 2.起始定界符SFD(1字节):指示一帧的开始. 3.目的地址DA(6字节):指出要接收该帧的工作站. 4.源地址SA(6字节):指示发送该帧的 ...

  2. VScode远程连接服务器

    VScode远程连接服务器 1.远程服务器安装rmate,在远程服务器上执行以下操作 wget https://raw.githubusercontent.com/sclukey/rmate-pyth ...

  3. [源码分析] Facebook如何训练超大模型---(1)

    [源码分析] Facebook如何训练超大模型---(1) 目录 [源码分析] Facebook如何训练超大模型---(1) 0x00 摘要 0x01 简介 1.1 FAIR & FSDP 1 ...

  4. Android Native -- Message/Handler/Looper机制(应用篇)

    ⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...

  5. MySQL存储引擎(最全面的概括)

    目录 一:MySQL存储引擎 1.什么是存储引擎? 2.查看存储引擎信息 二:MySQL支持的存储引擎 1.存储引擎 三:innoDB存储引擎 1.特性 2.存储结构 3.优缺点.适用场景 四:MyI ...

  6. Java高级语法之反射

    Java高级语法之反射 什么是反射 java.lang包提供java语言程序设计的基础类,在lang包下存在一个子包:reflect,与反射相关的APIs均在此处: 官方对reflect包的介绍如下: ...

  7. Linux 配置 kibana

    一.Kibana 是啥? Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据. 二.安装步骤? 1.kibana 是 ...

  8. git删除误传的.idea文件

    问题: 提交项目的时候忘记添加.gitignore文件,误上传了文件(如.idea)如何解决?如何删除Gitee地址上项目的.idea文件?(本文以.idea文件夹举例) 拉取项目 拉取项目 git ...

  9. js静态成员和实例成员

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. iOS 启动画面 App图标尺寸 项目上架必须Icon设置

    1.1AppIcon图标尺寸如下: 说明:AppIcon (6张) AppStore Icon (1张)(png格式) AppStore Icon --- 1024x1024(必须)   1.2启动画 ...