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

news2024/9/23 3:20:52

三层的概念: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{

    @Override
    public 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{

    @Override
    public 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{
    @Override
    public 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();

    @Override
    public 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();

    @Override
    public 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获取value
            String 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");

    @Override
    public 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");

    @Override
    public void save() {
        System.out.println("==========Controller层的新增方法=========");
        service.save();
    }
}

测试结果(运行成功):

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络命令之查看网口最大网速的一些方法?(/sys/class/net/ethx/speed、ethtool ethx)

文章目录 背景方法1: sysfs的net方法2&#xff1a;ethtool方法3&#xff1a;通过网卡型号获取方法4&#xff1a;通过网卡lspci输出信息直接获取方法5&#xff1a;高性能网卡可以通过物理连线光口信息获取后记 背景 经常需要查看不同网卡的网速&#xff0c;甚至相同大版本型号网…

一个简单的pytorch项目框架

框架的基本功能&#xff1a; 1. 模型的定义、训练与测试 2. 数据生成与数据迭代器 3. 训练日志记录 4. 训练过程实时监控 有了这个框架&#xff0c;后续所有复杂的AI项目都可以在此基础上拓展开发。 项目基本结构&#xff1a; 四个文件&#xff1a; sequence_mean_generate…

C++初阶_2:引用

本节咱们来说说引用&#xff1a; C添加了“引用”&#xff0c;与指针成了两兄弟——这两兄弟对我们今后写C代码可谓各有特点&#xff0c;缺一不可。 何谓引用&#xff1f; 引用&#xff1a;就是取别名 不知诸位可有别名&#xff1f;这里不妨举一本耳熟能详的小说《水浒传》&…

Redis16-批处理优化

目录 Pipeline 集群下的批处理 Pipeline 单个命令的执行流程&#xff1a; N条命令的执行流程&#xff1a; N条命令批量执行&#xff1a; Redis提供了很多Mxxx这样的命令&#xff0c;可以实现批量插入数据&#xff0c;例如&#xff1a; msethmset 利用mset批量插入10万条数…

vivado报错:file ended before end of clause

最近在学习Xilinx FPGA时&#xff0c;遇到 Vivado 报错如下图所示&#xff1a; 刚开始&#xff0c;看到错误是在第1行代码中出现的&#xff0c;我的第一反应是该行代码写错了&#xff0c;然后搜了搜语法&#xff0c;发现没错。 分析报错信息发现&#xff0c;该错误应该是和文件…

VScode + PlatformIO 和 Keil 开发 STM32

以前经常使用 KEIL 写 STM32 的代码&#xff0c;自从使用 VScode 写 ESP32 后感觉 KEIL 的开发环境不美观不智能了&#xff0c;后面学习了 VScode 开发 STM32 。 使用过程中发现 串口重定向在 KEIL 中可以用&#xff0c;搬到 VScode 后不能用&#xff0c;不用勾选 Use Micro LI…

SpringMVC 运行流程

SpringMVC 运行流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; SpringMVC的运行流程可概括为以下几个核心步骤&#xff1a; 流程图&#xff1a; #mermaid-svg-l1CeK9JwP5wRQjBL {font-family:"trebuchet ms",verdana,arial,…

医学图像分割新突破:6篇文献带你洞悉最前沿的医学AI技术|顶刊速递·24-08-14

小罗碎碎念 文献日推主题&#xff1a;人工智能在医学图像分割中的最新研究进展 今天这期文章信息量很大&#xff0c;并且不同的人看&#xff0c;获取的信息量也会差距很大。为了缩小这个差距&#xff0c;请在正式阅读前&#xff0c;记住小罗的一句话——模型学会了如何分割图像…

【Spark集群部署系列三】Spark StandAlone HA模式介绍和搭建以及使用

简介&#xff1a; Spark Standalone集群是Master-Slaves架构的集群模式&#xff0c;和大部分的Master-Slaves结构集群一样&#xff0c;存在着Master 单点故障&#xff08;SPOF&#xff09;的问题。 高可用HA 如何解决这个单点故障的问题&#xff0c;Spark提供了两种方案&#…

83.SAP ABAP从前台找字段所在表的两种方法整理笔记

目录 方法1&#xff1a;F1查看技术信息 F1 技术信息 方法2&#xff1a;ST05开启跟踪 Activate Trace Input and save data Deactivate Trace Display Trace 分析你想要的表 方法1&#xff1a;F1查看技术信息 从前台找一个屏幕字段所在表&#xff0c;一般通过按F1来查找…

Java Nacos与Gateway的使用

Java系列文章目录 IDEA使用指南 Java泛型总结&#xff08;快速上手详解&#xff09; Java Lambda表达式总结&#xff08;快速上手详解&#xff09; Java Optional容器总结&#xff08;快速上手图解&#xff09; Java 自定义注解笔记总结&#xff08;油管&#xff09; Jav…

【大数据】6:MapReduce YARN 初体验

目录 MapReduce & YARN 初体验 集群启停命令 一键启动脚本&#xff1a; 单进程启停 提交MapReduce任务到YARN执行 提交MapReduce程序至YARN运行 提交wordcount示例程序 提交求圆周率示例程序 拓展&#xff1a;蒙特卡罗算法求PI的基础原理 onte Carlo蒙特卡罗算法…

【MySQL 06】表的约束

文章目录 &#x1f308; 一、约束的概念&#x1f308; 二、空属性约束⭐ 1. 空值无法参与运算⭐ 2. 设置非空属性 &#x1f308; 三、默认值约束⭐ 1. 默认值使用案例⭐ 2. 同时设置 not null 和 default &#x1f308; 四、列描述约束&#x1f308; 五、zerofill 补零约束&…

贷齐乐漏洞复现+php特性绕过WAF

目录 一、环境搭建 1.将贷齐乐源码放入phpstudy中的www目录下 2.在phpstudy上创建网站&#xff1a; 3.在本地数据库中创建数据库--ctf&#xff0c;并创建users表&#xff1a; 4.往表中插入数据&#xff1a; 5.查看users表&#xff1a; 6.测试能否访问到数据库 二、源码分析…

力扣热题100_链表_234_回文链表

文章目录 题目链接解题思路解题代码 题目链接 234. 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出…

搭建MoneyPrinterTurbo,利用AI大模型,一键生成高清短视频实战

搭建MoneyPrinterTurbo&#xff0c;利用AI大模型&#xff0c;一键生成高清短视频 1.MoneyPrinterTurbo简介 只需提供一个视频 主题 或 关键词 &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 github地址&a…

【大模型从入门到精通19】开源库框架LangChain LangChain文档加载器1

目录 理解文档加载器非结构化数据加载器结构化数据加载器 使用文档加载器的实际指南设置和配置安装必要的包&#xff08;注意&#xff1a;这些包可能已经在你的环境中安装好了&#xff09;从 .env 文件加载环境变量从环境变量中设置 OpenAI API 密钥 在数据驱动的应用领域&…

企业如何组建安全稳定的跨国通信网络

当企业在海外设有分公司时&#xff0c;如何建立一个安全且稳定的跨国通信网络是一个关键问题。为了确保跨国通信的安全和稳定性&#xff0c;可以考虑以下几种方案。 首先&#xff0c;可以在分公司之间搭建虚拟专用网络。虚拟专用网络通过对传输数据进行加密&#xff0c;保护通信…

Java:jdk8以后开始接口新增的3种方法:default,private,static

文章目录 jdk8以后开始接口新增的方法默认方法&#xff1a;deafult私有方法private如何查看自己的jdk版本静态方法static 问题接口中不止有抽象方法为什么接口中的方法都是public为什么要增加这三种方法 jdk8以后开始接口新增的方法 默认方法&#xff1a;deafult 必须使用defa…

【CentOS 】DHCP 更改为静态 IP 地址并且遇到无法联网

文章目录 引言解决方式标题1. **编辑网络配置文件**&#xff1a;标题2. **确保配置文件包含以下内容**&#xff1a;特别注意 标题3. **重启网络服务**&#xff1a;标题4. **检查配置是否生效**&#xff1a;标题5. **测试网络连接**&#xff1a;标题6. **检查路由表**&#xff1…