news 2026/7/24 19:05:55

Web基础-分层解耦

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Web基础-分层解耦

三层架构

controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。

service:业务逻辑层,处理具体的业务逻辑。

dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。

为什么要对代码进行拆分?

遵循单一职责原则,便于复用、后期维护

分层解耦

耦合:衡量软件中各个层/各个模块的依赖关联程度

内聚:软件中各个功能模块内部的功能联系。

软件设计原则:高内聚低耦合

控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

Bean对象:IOC容器中创建、管理的对象,称之为Bean。

实现分层解耦的思路是什么?

将项目中的类交给IOC容器管理(IOC,控制反转)

应用程序运行时需要什么对象,直接依赖容器为其提供(DI,依赖注入)

IOC & DI 入门

1.将Dao及Service层的实现类,交给IOC容器管理。

2.为Controller及Service注入运行时所依赖的对象。

@RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/list") public List<User> list(){ //1.调用service,查询用户信息 List<User> userList = userService.list(); //.... }
@Component//将UserServiceImpl添加入IOC容器中 public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public List<User> findAll() { //1.调用dao获取数据 List<String> lines = userDao.FindAll(); //... }
@Conponent//将UserDaoImpl添加入IOC容器中 public class UserDaoImpl implements UserDao { @Override public List<String> FindAll(){ //1.加载并读取user.txt文件,获取用户数据 InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt"); ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList<>()); return lines; } }

1.如何将一个类交给IOC容器管理?

@Component (注意:是加在实现类上,而非接口上)

2.如何从IOC容器中找到该类型的bean,然后完成依赖注入?

@Autowired

IOC详解

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

注解说明位置
@Component声明bean的基础注解不属于以下三类时,用此注解
@Controller@Component注解标注在控制层类上
@Service@Component注解标注在业务层类上
@Repository@Component注解标注在数据访问层类上(由于与mybatis整合,用的少)

注意:声明bean的时候,可以通过注解的value属性指定bean的名字,如果没有指定,默认为类名首字母小写。

前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。

该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认的扫描范围是启动类所在包及其子包。

1.声明bean注解有哪几个?

@Controller

@Service

@Repository

@Component

2.注意事项

在Springboot集成web开发中,声明控制器bean只能用@Controller。

声明bean的注解要想生效,需要被扫描到,启动类默认扫描当前包及其子包。

DI详解

基于@Autowired进行依赖注入的常见方式有如下三种:

1:属性注入

@RestController public class UserController { @Autowired private UserService userService; //... }

优点:代码简洁、方便快速开发

缺点:隐藏了类之间的依赖关系、可能破坏类的封装性。

2: 构造函数注入

@RestController public class UserController { @Autowired//(构造器注入,如果当前类只有一个构造器,可以省略@Autowired注解) private UserService userService; public UserController(UserService userService) { this.userService = userService; } }

优点:能清晰地看到类的依赖关系、提高了代码的安全性。

缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。

注意:如果只有一个构造函数,@Autowired注解可以省略。

3:.setter注入

@RestController public class UserController { @Autowired private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } }

优点:保持了类的封装性,依赖关系更清晰。

缺点:需要额外编写setter方法,增加了代码量。

@Autowired注解,默认是按照类型进行注入的。

如果存在多个相同类型的bean,将会报出如下错误:

方案一:@Primary

@Primary @Service public class UserServiceImpl implements UserService { @Override public List<User> list(){ //省略... } }

方案二:@Qualifier

@RestController public class UserController{ @Autowired @Qualifier(“userServiceImpl") private UsersService userService; }

方案三:@Resource

@RestController public class UserController { @Resource(name = "userServiceImpl") private UserService userService; }

1.依赖注入的注解

@Autowired:默认按照类型自动装配

如果同类型的bean存在多个:

@Primary

@Autowired + @Qualifier

@Resource

2.@Resource 与 @Autowired区别?

@Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的

@Autowired默认是按照类型注入,而@Resource默认是按照名称注入

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 19:05:18

多语言句子嵌入在可靠性审计中的应用与实践指南

1. 先搞清楚这个项目到底要解决什么问题看到“Multilingual Sentence Embeddings for Linguistic-Integrated Reliability Audit”这个标题&#xff0c;很多人第一反应可能是“这又是个多语言模型”。但真正值得关注的是后半部分——“Linguistic-Integrated Reliability Audit…

作者头像 李华
网站建设 2026/7/24 19:04:45

049、YOLOv8改进实战:StarNet星型骨干替换Backbone与代码实现

049、YOLOv8改进实战&#xff1a;StarNet星型骨干替换Backbone与代码实现 一个让我失眠的调试经历 上个月做工业缺陷检测项目&#xff0c;客户要求模型在Jetson Orin上跑到60fps&#xff0c;同时保持mAP不低于0.85。我试了YOLOv8n、YOLOv8s&#xff0c;速度倒是达标了&#xff…

作者头像 李华
网站建设 2026/7/24 19:04:28

WMSST与MCNN-BiGRU混合模型在轴承故障诊断中的应用

1. 项目概述轴承故障诊断一直是工业设备健康管理中的关键环节。传统方法往往依赖专家经验或简单信号处理技术&#xff0c;难以应对复杂工况下的微弱故障特征提取。最近我在一个风机监测项目中尝试了WMSST时频分析结合MCNN-BiGRU的混合模型方案&#xff0c;实测效果比单一方法提…

作者头像 李华
网站建设 2026/7/24 19:03:10

信息系统项目管理师教程(第4版)笔记——第 4 章 信息系统管理

第 4 章 信息系统管理 4.1 管理方法 信息系统管理是组织全员参与的核心业务&#xff0c;需要专门职能部门和专业人员支撑&#xff0c;更需要管理者参与决策。在数字化时代&#xff0c;信息系统已成为所有业务模式的 “技术底座”&#xff0c;不仅是效率工具&#xff0c;更是业务…

作者头像 李华
网站建设 2026/7/24 19:01:29

OpenClaw强化学习对话系统安装与优化指南

1. OpenClaw项目概述OpenClaw是一个基于强化学习的智能对话系统框架&#xff0c;由火山引擎团队开源。这个框架最吸引我的地方在于它采用了类似AlphaGo的蒙特卡洛树搜索(MCTS)算法&#xff0c;能够实现多轮对话的长期策略优化。相比传统对话系统&#xff0c;OpenClaw在复杂场景…

作者头像 李华
网站建设 2026/7/24 18:58:54

社交 分享 预览 Open Graph 标签:5分钟排查微信抓取失败的3个常见原因

网页发到聊天群变成一串单调的字母。查看网页源代码&#xff0c;头部区域一片空白。上周五一家跨境机构把新品页面发给两千个内部客户&#xff0c;卡片没有任何图文修饰&#xff0c;访问量停留在了个位数。聊天软件的服务器读取网页代码的时间窗口以毫秒计算。代码里缺少特定的…

作者头像 李华