springboot从分层到解耦

news2024/11/19 19:27:06

注释很详细,直接上代码

三层架构

  • 项目结构
    在这里插入图片描述

源码:

HelloController

package com.amoorzheyu.controller;

import com.amoorzheyu.pojo.User;
import com.amoorzheyu.service.HelloService;
import com.amoorzheyu.service.impl.HelloServiceA;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

/*  注解标识请求处理类 */
@RestController
public class HelloController {

    private HelloService helloService = new HelloServiceA();
    /* 标识请求路径 */
    //test
    @RequestMapping( "/hello")
    public String hello(){
        List<User> list =helloService.getUserList() ;
        return list.toString();
    }
}

HelloDao

package com.amoorzheyu.dao;

import com.amoorzheyu.pojo.User;

import java.util.List;

public interface HelloDao {
    //获取用户信息列表
    public List<User> getUserList();
}

HelloDaoA

package com.amoorzheyu.dao.impl;

import com.amoorzheyu.dao.HelloDao;
import com.amoorzheyu.pojo.User;

import java.util.ArrayList;
import java.util.List;

public class HelloDaoA implements HelloDao {

    @Override
    public List<User> getUserList() {

        //调用dao获取数据
        List<User> ReturnList = new ArrayList<User>();

        //模拟数据
        ReturnList.add(new User("Amoor", 18,null));
        ReturnList.add(new User("Bob", 19,null));
        ReturnList.add(new User("Candy", 20,null));
        return ReturnList;
    }
}

HelloService

package com.amoorzheyu.service;

import com.amoorzheyu.pojo.User;

import java.util.List;

public interface HelloService {
    //获取信息列表
    public List<User> getUserList();
}

HelloServiceA

package com.amoorzheyu.service.impl;

import com.amoorzheyu.dao.HelloDao;
import com.amoorzheyu.dao.impl.HelloDaoA;
import com.amoorzheyu.pojo.User;
import com.amoorzheyu.service.HelloService;

import java.util.List;

public class HelloServiceA implements HelloService {

    //newDao实现类
    private HelloDao helloDao = new HelloDaoA();


    @Override
    public List<User> getUserList() {

        List<User> ReturnList = helloDao.getUserList();

        return ReturnList;
    }
}

User

package com.amoorzheyu.pojo;

public class User {
    private Integer age;
    private String name;

    private Address address;

    public User( String name,Integer age, Address address) {
        this.age = age;
        this.name = name;
        this.address = address;
    }

    public Address getAddres() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

我们可以发现层级之间在new时耦合了,也就是说改了此处会影响其他地方,其他位置也需要改动,为了解决这些问题我们可以引入以下思想

控制反转:Inversion Of Control,简称ioc,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转;
依赖注入:Dependency Injection,简称Dl,容器为应用程序提供运行时,所依赖的资源,称之为依赖注入;
Bean对象:Oc容器中创建、管理的对象,称之为bean;

解耦

以下修改为去除new的内容+添加控制反转与依赖注入注解
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

GoogleSQL:SQL 中的 Pipe 语法

这些是我根据论文 SQL Has Problems 编写的笔记。我们可以修复它们&#xff1a;SQL 中的 Pipe 语法 TL博士 SQL 长期以来一直是结构化数据处理的主导语言&#xff0c;通过本文&#xff0c;GoogleSQL 团队引入了一种新的管道结构化数据流语法&#xff0c;该语法显著提高了 SQL …

自学前端靠谱吗?

很多同学都会对自学前端持怀疑态度&#xff0c;这靠谱吗&#xff1f; 靠自学能学得会&#xff1f;一听就不靠谱&#xff0c;一定是骗子。 但实际上&#xff0c;大家都掉入一个错觉当中了。。。 一个天大的错觉 指望公司教你 在大厂&#xff0c;会有培训体系&#xff0c;会…

51单片机快速入门之定时器和计数器

51单片机快速入门之定时器 断开外部输入 晶振振荡 假设为 12MHz 12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒 溢出(值>65536 时)>中断>执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536 此时定时器会从 64536 开始计…

AD6120 60V降压芯片 2A的电流 适用于48V降12/5v 高效率转换

AD6120是一款电流模式单片降压开关稳压器&#xff0c;输入电压范围为5V~60V&#xff0c;可在宽输入电压范围内提供2A的连续输出电流&#xff0c;具有优异的负载和线路调节能力。在轻负载下&#xff0c;该稳压器以低频率运行&#xff0c;以保持高效率和低输出纹波 。电流模式控制…

性能测试-jmeter连接数据库(十七)...

百度服务器域名&#xff1a;www.baidu.com 百度的IP&#xff1a;110.242.68.3&#xff08;使用ping www.baidu.com&#xff09; jdbc:mysql://211.103.136.244:7061/test_db: mysql是数据库类型211.103.136.244是服务器IP7061是服务器端口号test_db是服务器的数据库 一、为…

Vite项目中的懒加载介绍

概述 import.meta 元属性将特定上下文的元数据暴露给 JavaScript 模块。它包含了这个模块的信息&#xff0c;例如这个模块的 URL。在vue3项目中&#xff0c;用的比较多的是通过import.meta.env来获取环境变量。而本文将要介绍的import.meta.glob和import.meta.env都是vite提供…

【零基础学习CAPL】——CRC值监控测试

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 ——————————————————————————————————–—— 从0开始学习CANoe使用 从0开始学习车载车身 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 1.概述2.需求介绍3.算法4.逻辑判断5.测…

VS2022中文字符输出为乱码的解决

一、问题 vs2022输出中文时&#xff0c;出现乱码现象 二、解决方案 把文件的字符编码格式改为utf-8格式 选择工具&#xff0c;点击自定义 选择命令&#xff0c;点击添加命令 选择文件&#xff0c;点击高级保存选项&#xff0c;然后点击确定 点击高级保存选项 选择utf-8编…

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…

华为SMU02B1智能通信电源监控单元模块简介

华为SMU02B1是一款智能通信电源监控单元模块&#xff0c;专为5G嵌入式机框设计&#xff0c;它在通信电源管理领域扮演着重要角色。以下是对该产品的详细介绍&#xff1a; 一、产品概述 主要功能&#xff1a;华为SMU02B1能够监控和管理通信电源系统&#xff0c;提供站点监控功能…

QLExpress规则引擎简述;字符串公式/脚本运算

概述 在业务中会遇到一些场景的运算方式不是固定的&#xff0c;而且内容不是有规律的&#xff0c;无法落库到表中&#xff08;强行落库后也需要针对该内容硬编码写一段特殊的查询方式&#xff09;&#xff1b; 这个时候将这部分计算抽取出来&#xff0c;用一个动态的脚本去执…

Spring web mvc入门练习

对于Spring方面的知识重在多练习 目录 一、计算器 1、前端界面 2、约定前后端交互接口 3、服务器代码 二、用户登录 前端代码 服务器代码 三、留言板 后端代码 前端代码 一、计算器 我们需要通过前后端的交互最终完成这样的界面以及完成需求 1、前端界面 因为主要…

windows系统离线搭建darknet

没有网的情况下采用将安装包全部都下载下来&#xff0c;再安装的方式。darknet在windows上编译问题比较多&#xff0c;经历了3天的踩坑&#xff0c;终于搭建好。。。下面简单记录一下安装过程。 1.下载cuda,cudnn,anaconda,opencv,opencv_python&#xff0c;vs。安装顺序&…

[Redis] Redis中的Hash类型和List类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

CISP-PTE CMS sqlgun靶场渗透测试

1.打开靶场 2.在搜索框尝试xss <script>alert(1)</script> 发现此处存在xss漏洞 3.在搜索框尝试sql注入 -1 union select 1,2,3# 发现页面有回显 4.查询数据库名 -1 union select 1,database(),3# 5.查询数据库的所有表 -1 union select 1,(select group_conc…

Matlab做二阶函数

关于解答&#xff1a; >> % Expert PID Control % 二阶传递函数的阶跃响应 % 位置式 clc; clear all; close all;n500; % 设置离散点的个数 Ts0.001; % 设置离散的采样时间 epsilon0.001; …

剪辑视频怎么放慢速度?6种方法可以轻易做到

在这个快节奏的短视频时代&#xff0c;视频编辑中的慢动作效果往往能吸引观众的眼球&#xff0c;赋予画面以独特的艺术感和情感深度。但是很多小伙伴不知道该怎么将视频播放速度放缓&#xff0c;今天&#xff0c;给大家分享6种剪辑视频放慢速度的高效方法&#xff0c;一起来学习…

【物理编程】解决物理压力的正确画法

这里写自定义目录标题 压力的画法 压力的画法 该程序是一个交互式的教育工具&#xff0c;它通过可视化的方式帮助学生和教师理解多边形的几何特性以及力的表示方法。以下是该程序的一些优点和对教师的帮助&#xff0c;用专业的语言进行总结&#xff1a; 增强理解力&#xff1a…

98、RS485全自动收发电路入坑笔记

因为RS485采用叉分信号&#xff0c;只支持半双工。正常的RS485芯片驱动电路是需要GPIO来切换发送和接收模式。如下图所示&#xff0c;一般的RS485电平转换芯片都有RE/DE脚&#xff0c;用来切换收发模式。 例如这篇推荐&#xff1a;芯片RS485自动收发电路常见问题与应对策略 但…

【kubernetes】Ingress和Ingress-Controller介绍,高可用应用案例

一&#xff0c;Ingress介绍 Ingress是k8s中一种重要的资源对象&#xff0c;它主要用于定义从集群外部到集群内部服务的HTTP(S)路由规则。用于管理代理 Ingress-Controller的配置文件。 kubectl explain ingress二&#xff0c;Ingress-Controller介绍 Ingress Controller 是 …