使用传统的三层架构出现的问题.引入Spring底层实现原理来解决(工厂模式+反射+XML配置文件/注解)
以前写的代码
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配置文件/注解)的更多相关文章
- 4、传统三层架构与DDD分层架构
4.传统三层架构与DDD分层架构 模型是抽象的 现实是形象的 技巧是重要的 思想是永恒的 从传统三层架构与DDD分层架构的编程演变其实是思想的演变. 传统三层架构,即用户界面层UI.业务逻辑层BAL. ...
- jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)
经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传统的三层架构! 一共可以分为4个层: 模型层(可有可无),客户端,服务端, ...
- 基于EF+WCF的通用三层架构及解析
分享基于EF+WCF的通用三层架构及解析 本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务 ...
- 从MVC和三层架构说到SSH整合开发
相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println( ...
- 分享基于EF+WCF的通用三层架构及解析
本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: ...
- (转)浅析三层架构与MVC模式的区别
MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据 ...
- SSH和三层架构的MVC模式的对应关系
1.MVC(Model-View-Controller)设计模式: 首先让我们了解下MVC(Model-View-Controller)的概念: MVC全名是Model View Controller ...
- 浅析MVC模式与三层架构的区别01
三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层)三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI ...
- MVC模式与三层架构的区别
之前总是混淆MVC表现模式和三层架构模式,为此记录下. 三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层) 三层架构(3-tier application) ...
随机推荐
- linux高大上命令001
[ linux命令 sed ] sed是一个管道命令,可以分析standard input 而且sed可以将数据进行替换.删除.新增.选取的特定的功能 sed [-nefr] [动作] -n ...
- HTTP API认证授权方案
目录 一.需求背景 二.常用的API认证技术 2.1 App Secret Key + HMAC 2.2 OAuth 2.0 2.2.1 Authorization Code Flow 2.2.2 C ...
- [硬件]USB TYPE C引脚定义
- 【小记录】android下opencv的cv::dft()函数,CPU版本与opencl版本的性能相差16倍
cv::dft 相差15.9倍 cpu版本 单次调用 0.029448 毫秒 opencl版本 单次调用 0.468688 毫秒 差别仅 ...
- 针对vue中请求数据对象新添加的属性不能响应式的解决方法
1.需要给对象添加属性时,不能采用传统的obj.属性=值,obj[属性]=值 来添加属性,在vue页面时需要这样使用 this.$set(obj,"propertyName",&q ...
- IoC容器-Bean管理XML方式(注入空值和特殊符号)
Ioc操作Bean管理(xml注入其他类型属性), 字面量 (1)null值 (2)属性值包含特殊符号
- python内置re模块全面实战
目录 一:取消转义 二:python内置模块之re模块 三:常用方法 findall search match 简便 四:常用方法 finditer 匹配文件多情况 五:切割 替换 内置模块 六:分组 ...
- JavaScript数据结构之链表
链表相较于数组的优缺点 1. 链表在 插入.删除.移动数据效率比数组要高,数组插入.移动.删除数据需要改变没有数据的索引,而链表则只需要更改指针即可 2. 在查询方面,数组要优于链表,数组存储的数据是 ...
- Luogu P1314 [NOIP2011 提高组] 聪明的质监员
P1314 [NOIP2011 提高组] 聪明的质监员 题意 题目描述 给定\(n\)个物品,给定每个物品的 重量 \(w_i\) 和 价值 \(v_i\) 给定一个标准值 \(s\) 以及一个参数 ...
- Servlet中@WebServlet属性详解
感谢原文作者:想当一只小小攻城狮 原文链接:https://blog.csdn.net/weixin_45493751/article/details/100559683 在Servlet中,设置了@ ...