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

三层的概念: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();}
}

测试结果(运行成功):

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/399898.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2】初识JVM

目录 一.什么是JVM 二.JVM的功能 2.1即时编译 三.常见的JVM​编辑 ​编辑 总结​编辑 一.什么是JVM 二.JVM的功能 2.1即时编译 三.常见的JVM 总结

基于Java中的SSM框架实现高校就业管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校就业管理系统演示 摘要 本论文主要讲述了基于SSM框架及MySQL数据库实现的就业管理系统的设计和开发过程。本论文中所讲的就业管理系统是通过所学的知识创办一个非商业性的网站平台&#xff0c;使所有想要就业信息查看的高校毕业生们与想要宣传自己…

Spring Web MVC入门(中)

1. 请求 访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要 是学习如何传递参数到后端以及后端如何接收. 传递参数, 咱们主要是使⽤浏览器和Postman来模拟&#xff1b; 1.1 传递单个参数 接收单个参数&#xff0c;在Spring MV…

Spring boot敏感参数加密配置

一&#xff0c;背景 在项目中很多参数会被配置到配置文件中&#xff0c;比如说密钥&#xff0c;用户名&#xff0c;数据库连接&#xff0c;账号密码之类的&#xff0c;如果用明文配置&#xff0c;会有一定的安全风险。为了减小风险&#xff0c;增加对敏感配置数据的加密配置。…

路径规划 | 五种经典算法优化机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 五种经典算法优化机器人路径规划&#xff0c;算法可任意更换&#xff01;地图可修改&#xff01;Matlab语言 1.分为简单路径规划和复杂路径规划两种情景&#xff0c;采用粒子群算法(PSO)&#xff0c;遗传算法(GA)&am…

快速上手Spring Boot

快速上手Spring Boot (qq.com)

YOLO基础-目标检测的性能指标详解与计算方法

目标检测是计算机视觉中的重要任务&#xff0c;主要目的是在图像中识别并定位特定的物体。YOLO&#xff08;You Only Look Once&#xff09;系列模型作为目标检测领域的代表性方法之一&#xff0c;凭借其高效和准确的特点&#xff0c;广泛应用于实际场景中。本文通过详细介绍目…

AI技术在招聘数据分析洞察中的作用

一、引言&#xff1a;AI赋能招聘新纪元 在数字化转型浪潮中&#xff0c;人工智能技术&#xff08;AI&#xff09;正以前所未有的速度渗透至各行各业&#xff0c;其中&#xff0c;招聘领域正经历着一场深刻的变革。传统招聘模式依赖于人工筛选简历、面试评估等低效且主观性强的…

2024年翻译工具新风尚:实时翻译与精准度并进

语言交流的障碍随着全球化的不断深入日益成为连接不同文化和国家的挑战。然而&#xff0c;在科技日新月异的今天&#xff0c;类似谷歌翻译这样的工具正在高速发展这。这次我们来一起探讨深受用户喜欢的翻译工具有哪些。 1.福昕在线翻译 链接直达&#xff1a;https://fanyi.pd…

数据结构 - 位图 | 布隆过滤器

文章目录 一、位图1、位图概念2、实现一个简略的位3、位图的优缺点4、位图的应用场景 二、布隆过滤器1、提出2、概念3、布隆过滤器的实现 三、海量数据处理1、哈希切割2、面试题 一、位图 1、位图概念 位图&#xff08;Bitmap&#xff09;是一种非常高效的数据结构&#xff0c…

MySQL基础练习题38-每位教师所教授的科目种类的数量

目录 题目 准备数据 分析数据 总结 题目 查询每位老师在大学里教授的科目种类的数量。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Teacher (teacher_id int, subject_id int, dept_id int)## 向表中插入数据 Truncate table…

[Megagon Labs] Annotating Columns with Pre-trained Language Models

Annotating Columns with Pre-trained Language Models 任务定义 输入&#xff1a;一张数据表&#xff0c;但没有表头&#xff0c;只有表中的数据。 输出&#xff1a;每一列数据的数据类型&#xff0c;以及两列数据之间的关系。 数据类型和数据关系都是由训练数据决定的固定…

自建Gitlab和Gitlab runner并推送镜像到Harbor

1. 创建虚拟机 整体规划如下 1.1 创建3台虚拟机 系统版本Centos7.9 设置IP分别为 192.168.200.201 、192.168.200.202、 192.168.200.203 1.2 安装docker 3台虚拟机都安装docker&#xff0c;参考文章 安装docker 1.3 修改daemon.json 修改 /etc/docker/daemon.json 文件…

开源异构数据库同步工具DBSyncer

DBSyncer是一款开源的数据同步中间件&#xff0c;它提供了多种数据库和数据源之间的同步解决方案&#xff0c;包括MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。 以下是对DBSyncer的详细介绍&#xff1a; 一、主要功能与特点 多种…

业界首个OpenTelemetry结合eBPF的向导式可观测性平台APO正式开源

AutoPilot Observability (简称APO&#xff09;是什么&#xff1f; 开箱即用的可观测性平台&#xff1a;APO 致力于提供一键安装、开箱即用的可观测性平台。APO 的 OneAgent 支持一键免配置安装 Tracing 探针&#xff0c;支持采集应用的故障现场日志、基础设施指标、应用和下游…

Unity物理模块 之 ​2D碰撞器

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1.碰撞器是什么 在 Unity 中&#xff0c;碰撞器&#xff08;Collider&#xff09;是一种组件&#xff0c;用于检测物体之…

P37-数据存储

数据类型介绍 前面学习了基本的内置类型&#xff1a; 以及它们所占存储空间的大小。 类型的意义&#xff1a; 1.使用这些类型开辟空间的大小&#xff08;大小决定了使用范围&#xff09; 2.如何看带内存空间的视角 类型的基本归类 整形家族 之所以char也分类在其中是因为实…

【图形验证和AI智能及CHATGPT对抗影响的是用户体验】

验证码本质上自带一层答案的语义&#xff0c;这原本是天然的区分人和自动程序的地方&#xff0c;但在今日却未必&#xff0c;由于AI智能及CHATGPT的发展机器要识别也变得容易。 一 &#xff1a;攻防思路 黑产对于验证码图片答案的获取主要有两种手段——图片穷举破解和图片模…

ComfyUI - 在服务器中部署 AIGC 绘画的 ComfyUI 工具 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141140498 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 ComfyU…

分布式知识总结(基本概念)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 基本概念 吞吐量 指系统在单位时间能够处理多少个请求 QPS 每秒…