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

JavaWeb后端-Web基础-分层解耦

三层架构

在这里插入图片描述

  • controller:控制层,接受前端发送的请求,对请求进行处理,并响应数据
/*** 用户信息Controller*/
@RestController()
public class UserController {
//    @RequestMapping("/list")
//    public List<User> list() throws Exception {
//        //1、加载并读取user.txt文件,获取用户数据
//        //InputStream in = new FileInputStream(new File("D:\\JavaDevelop\\javaWeb\\web-ai-code\\web-ai-project01\\springboot-web-01\\src\\main\\resources\\user.txt"))
//        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");
//        ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList<>());
//        //2、解析用户信息,封装为User对象->list集合
//        List<User> userList = lines.stream().map(line -> {
//            String[] parts = line.split(",");
//            Integer id = Integer.parseInt(parts[0]);
//            String Username = parts[1];
//            String password = parts[2];
//            String name = parts[3];
//            Integer age = Integer.parseInt(parts[4]);
//            LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//            return new User(id, Username, password, name, age, updateTime);
//        }).collect(Collectors.toList());
//
//        //3、返回数据(json)
//        return userList;
//    }private UserService userService=new UserServiceImpl();
@RequestMapping("/list")
public List<User> list() throws Exception {//1、调用service获取数据List<User> userList = userService.findAll();//2、返回数据(json)return userList;
}
}
  • service:业务逻辑层,处理具体的业务逻辑
public class UserServiceImpl implements UserService {private UserDao userDao=new UserDaoImpl();@Overridepublic List<User> findAll() {//1、调用dao获取数据List<String> lines = userDao.findAll();//2、解析用户信息,封装为User对象->list集合List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String Username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, Username, password, name, age, updateTime);}).collect(Collectors.toList());return userList;}
}
  • dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查
public class UserDaoImpl implements UserDao {@Overridepublic List<String> findAll() {//1、加载并读取user.txt文件,获取用户数据//InputStream in = new FileInputStream(new File("D:\\JavaDevelop\\javaWeb\\web-ai-code\\web-ai-project01\\springboot-web-01\\src\\main\\resources\\user.txt"))InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList<>());return lines;}
}

分层解耦

耦合:衡量软件中各个层/各个模块的依赖关联程度
内聚:软件中各个功能模块内部的功能联系
在这里插入图片描述
控制反转:Inversion Of Control,简称IOC,对象的创建控制权由程序自身转移到外部(容器)
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时所依赖的资源,称为依赖注入
Bean对象:IOC容器中创建、管理的对象

IOC&DI入门

步骤
1、将Dao及Service层的实现类,交给IOC容器管理(类前注解@Component)

@Component//将当前类交给IOC容器管理
public class UserDaoImpl implements UserDao {@Overridepublic List<String> findAll() {//1、加载并读取user.txt文件,获取用户数据//InputStream in = new FileInputStream(new File("D:\\JavaDevelop\\javaWeb\\web-ai-code\\web-ai-project01\\springboot-web-01\\src\\main\\resources\\user.txt"))InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList<>());return lines;}
}
@Component
public class UserServiceImpl implements UserService {@Autowired//应用程序运行时会自动查找该类的bean对象,并赋值给该成员变量private UserDao userDao;@Overridepublic List<User> findAll() {//1、调用dao获取数据List<String> lines = userDao.findAll();//2、解析用户信息,封装为User对象->list集合List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String Username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, Username, password, name, age, updateTime);}).collect(Collectors.toList());return userList;}
}

2、为Controller及Service注入运行时所依赖的对象(成员变量前注解@Autowired)

@Component
public class UserServiceImpl implements UserService {@Autowired//应用程序运行时会自动查找该类的bean对象,并赋值给该成员变量private UserDao userDao;@Overridepublic List<User> findAll() {//1、调用dao获取数据List<String> lines = userDao.findAll();//2、解析用户信息,封装为User对象->list集合List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String Username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, Username, password, name, age, updateTime);}).collect(Collectors.toList());return userList;}
}
@RestController()
public class UserController {
//    @RequestMapping("/list")
//    public List<User> list() throws Exception {
//        //1、加载并读取user.txt文件,获取用户数据
//        //InputStream in = new FileInputStream(new File("D:\\JavaDevelop\\javaWeb\\web-ai-code\\web-ai-project01\\springboot-web-01\\src\\main\\resources\\user.txt"))
//        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");
//        ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList<>());
//        //2、解析用户信息,封装为User对象->list集合
//        List<User> userList = lines.stream().map(line -> {
//            String[] parts = line.split(",");
//            Integer id = Integer.parseInt(parts[0]);
//            String Username = parts[1];
//            String password = parts[2];
//            String name = parts[3];
//            Integer age = Integer.parseInt(parts[4]);
//            LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//            return new User(id, Username, password, name, age, updateTime);
//        }).collect(Collectors.toList());
//
//        //3、返回数据(json)
//        return userList;
//    }@Autowiredprivate UserService userService;
@RequestMapping("/list")
public List<User> list() throws Exception {//1、调用service获取数据List<User> userList = userService.findAll();//2、返回数据(json)return userList;
}
}

IOC详解

在这里插入图片描述
注意
声明bean时,可通过注解的value属性指定bean的名字,若没有指定,默认为类名首字母小写

DI详解

基于@Autowired进行依赖注入的常见方式:

  • 在这里插入图片描述优点:代码简介
    缺点:隐藏了类之间的依赖关系,可能破坏类的封装性

  • 在这里插入图片描述
    优点:清晰的看到类的依赖关系,提高代码安全性
    缺点:代码繁琐,若构造参数过多,可能导致构造函数臃肿
    注意:若只有一个构造函数,@Autowired注解可省略

  • 在这里插入图片描述
    优点:保证了类的封装性,依赖关系更清晰

若存在多个相同的bean,会报错
解决方案
在这里插入图片描述

http://www.dtcms.com/a/519905.html

相关文章:

  • 基于Chrome140的FB账号自动化(关键词浏览)——运行脚本(三)
  • 如何在百度做自己公司的网站c 网站建设设计报告
  • 00910网络经济与企业管理真题题库
  • Transformer:从自注意力到大模型时代的核心基石
  • 数据结构(7)
  • Python数据分析实战:利用CDC 28年流感数据监测,构建疫情预警系统【数据集可下载】
  • LangChain最详细教程之Model I/O(一)
  • conda 管理 python 版本和虚拟环境
  • conda创建在指定目录创建项目
  • Qt 编译报错:-1: error: fatal error: Killed signal terminated program cc1plus
  • wpf之颜色选择控件的使用
  • iOS 混淆实战清单:多工具组合完成 IPA 混淆、加固与交付治理(IPA加固 iOS混淆 无源码加固 Ipa Guard Swift Shield)
  • 「IOS苹果游戏」600个
  • 怎么看一个网站的cmsWordpress 主题 修改 版
  • 云平台+自助教室:利用微服务架构实现高效资源调度
  • 面试知识点-1022
  • Cursor MCP 第一章-第一节-MCP协议简介.md
  • 关于机器人队列、机器人调度、机器人会车、机器人避让的若干介绍
  • 做个网站多钱牛搬家网企业网站排名
  • 在AWS S3上动态自定义图片尺寸:Lambda + API Gateway无服务器解决方案
  • 《3D手游云原生开发:关键难题突破日志》
  • Docker 学习手册
  • Docker 镜像构建:手把手教你用 docker commit 定制专属镜像
  • 有哪个网站可以做ppt赚钱宁波网络推广团队
  • 力扣每日一题(三)划分题 + 思路题
  • Python爬虫第10课:分布式爬虫架构与Scrapy-Redis
  • 2025年运维部网络安全工作小结1025
  • 基于 Python 的坦克大战小程序,使用 Pygame 库开发
  • 做网站前期需求分析收费么互联网营销是做什么
  • 在 MacOS 中安装 MySQL 8