当前位置: 首页 > news >正文

模拟三层--控制层、业务层和数据访问层

三层的概念:https://developer.aliyun.com/article/1390024

一、新建一个项目

        我新建好的项目名为spring__ioc_02,然后在 src-main-java 下建立三层(数据访问层、业务层和控制层)的包 dao、service 和controller、并在包下建立相应的接口和实现类

        Project 只能一次有一个,我们想要让所有的项目出现在一列,就需要在现有 Project 基础上 New-Module

然后 next

        Parent 改为 <None>;删掉我们依赖建立的目录 \Demo001\,若不删,新项目就会建立在 \Demo001\ 下,称为项目 Demo001 的子项目

然后 finish 即创建成功

(一)创建三层(控制层、业务层和数据访问层)对应的包,包下建立相应的接口和实现类

1、控制层

紫色为包名、绿色为接口名

package com.apesource.controller;public interface IUserController {//定义方法public void save();
}

创建实现类

package com.apesource.controller;
//UserControllerImp 实现 IUserController 接口并重写方法
public class UserControllerImp implements IUserController{@Overridepublic void save() {System.out.println("==========Controller层的新增方法=========");}
}

2、业务层

把 .controller 删掉写成 .service,就成功建立与 Controller 同级的包 service

同 Controller 步骤创建接口和实现类

package com.apesource.service;public interface IUserService {public void save();
}
package com.apesource.service;public class UserServiceImp implements IUserService{@Overridepublic void save() {System.out.println("===========service层的新增方法===========");}
}
package com.apesource.dao;import java.sql.SQLOutput;
import java.util.SortedMap;public interface IUserDao {public void save();
}
package com.apesource.dao;public class UserDaoImp implements IUserDao{@Overridepublic void save() {System.out.println("==========dao层的新增方法=========");}
}

三层准备完毕、写测试类

(二)测试类

建一个与 Conterller 包同级的包 test,test里面建立一个 Test01 测试类

测试类不要忘了main 方法

1、高耦合方式

package com.apesource.test;import com.apesource.controller.IUserController;
import com.apesource.controller.UserControllerImp;import java.sql.SQLOutput;public class Test01 {public static void main(String[] args) {IUserController controller=new UserControllerImp();controller.save();}
}

当然,dao 层为数据访问层、然后 service 层调用数据访问层,controller 层调用 service 层,所以目前的测试类执行有误,我们还需要对 service 层和controller 层做一定的处理,new 相应对象(高耦合)

package com.apesource.service;import com.apesource.dao.IUserDao;
import com.apesource.dao.UserDaoImp;public class UserServiceImp implements IUserService{IUserDao dao=new UserDaoImp();@Overridepublic void save() {System.out.println("===========service层的新增方法===========");dao.save();}
}
package com.apesource.controller;import com.apesource.service.IUserService;
import com.apesource.service.UserServiceImp;public class UserControllerImp implements IUserController{IUserService service = new UserServiceImp();@Overridepublic void save() {System.out.println("==========Controller层的新增方法=========");service.save();}
}

测试结果(运行成功):

2、低耦合方式

我们要实现解耦,先将 业务层和数据访问层的实现类的路径 拿出来放在 properties 文件中

dao=com.apesource.dao.UserDaoImp
service=com.apesource.service.UserServiceImp

建一个与 Conterller 包同级的包 util,util 里面建立一个 BeansFactory 工厂类,通过这个类实现解耦

package com.apesource.util;import com.apesource.test.Test01;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class BeansFactory {//按照用户需求以解耦的方式创建对象public static Object getBean(String key){try {//1.创建工具类Properties properties = new Properties();//2.加载文件InputStream inputStream = Test01.class.getClassLoader().getResourceAsStream("beans.properties");properties.load(inputStream);//3.通过key获取valueString classPath = properties.getProperty(key);return Class.forName(classPath).newInstance();} catch (IOException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException exception) {exception.printStackTrace();}return null;}}
package com.apesource.test;import com.apesource.controller.IUserController;
import com.apesource.controller.UserControllerImp;import java.sql.SQLOutput;public class Test01 {public static void main(String[] args) {IUserController controller=new UserControllerImp();controller.save();}
}

当然,dao 层为数据访问层、然后 service 层调用数据访问层,controller 层调用 service 层,所以目前的测试类执行有误,我们还需要对 service 层和controller 层做一定的处理

package com.apesource.service;import com.apesource.dao.IUserDao;
import com.apesource.dao.UserDaoImp;public class UserServiceImp implements IUserService{IUserDao dao= (IUserDao) BeansFactory.getBean("dao");@Overridepublic void save() {System.out.println("===========service层的新增方法===========");dao.save();}
}
package com.apesource.controller;import com.apesource.service.IUserService;
import com.apesource.service.UserServiceImp;public class UserControllerImp implements IUserController{IUserService service = (IUserService) BeansFactory.getBean("service");@Overridepublic void save() {System.out.println("==========Controller层的新增方法=========");service.save();}
}

测试结果(运行成功):

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 抓包分析排查利器TCPdump
  • Qt读写sysfs
  • 8月13日学习笔记 LVS
  • 代码随想录算法训练营day42|动态规划part09
  • 【中等】 猿人学web第一届 第5题 js混淆-乱码增强
  • HAProxy原理及实例
  • 51单片机学习记录-数码管操作
  • Unity 流光shader的思路
  • 开源模型应用落地-LangChain高阶-记忆组件-RedisChatMessageHistory正确使用(八)
  • java注解(实现原理及自定义注解)
  • Flask获取请求信息
  • Stable Diffusion绘画 | ControlNet应用-NormalMap(法线贴图)
  • WPF APP生命周期和全局异常捕获
  • 使用Qdrant+FastText实现向量存储和检索
  • YOLO基础-目标检测的性能指标详解与计算方法
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [Vue CLI 3] 配置解析之 css.extract
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • C++类的相互关联
  • CSS 提示工具(Tooltip)
  • EventListener原理
  • java 多线程基础, 我觉得还是有必要看看的
  • Java基本数据类型之Number
  • JWT究竟是什么呢?
  • Mithril.js 入门介绍
  • Mocha测试初探
  • VuePress 静态网站生成
  • vue-router 实现分析
  • Vue学习第二天
  • Xmanager 远程桌面 CentOS 7
  • 半理解系列--Promise的进化史
  • 翻译:Hystrix - How To Use
  • 目录与文件属性:编写ls
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​io --- 处理流的核心工具​
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #includecmath
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (10)ATF MMU转换表
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C++20) consteval立即函数
  • (八)Flink Join 连接
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)创业家杂志:UCWEB天使第一步
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?