三层架构理解(实现前后端分离)

简介: 本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。

三层架构理解(实现前后端分离)

 1.浏览器进行访问

2.通过vue的异步请求,调用后端()通过@RequestMapping注解进行映射到controller,此时的页面未进行渲染

3后端

.c-s-d 以及d-s-c都是因为之间的方法调用(思考时,可以倒着思考,就是

提出请求时:controller调用Service 的方法,而Service 又调用Daode方法

请求返回: Dao访问数据传给Service ,Service处理完数据返回给controller)
4.数据处理完成后,由vue渲染,之后展现

顺序:

浏览器请求index.html → 服务器返回HTML → 浏览器解析Vue代码 →Vue mounted钩子触发axios请求 → 请求到达Spring Controller →Controller调用Service → Service调用Dao → Dao读取文件 →数据返回Service → Service返回Controller → Controller返回JSON →axios接收响应 → Vue更新数据 → 表格渲染完成

默认时index.html,没有只能显示调用需要访问的界面

bean重复解决方案

ioc重复(不同包下类名相同),重复:加入bean的对象名相同(因为加入bean的对象是根据类名的小驼峰创建的)

示例:

@Service(自定义对象别名) ,eg: 类UserServiceImpl上@Service("abc") ,对象名字就是abc// 语法2的应用场景:当包名不一样但是类名一样的时候就需要起别名

di重复(注入时重复):因为定义时市根据接口定义的,注入是根据接口来查询的(接口是可以有多个实现类的)

解决方案一:添加在实现类上 ;设定优先级/@Primary

//@Primary//解决依赖注入存在多个类型对象方案1:设置优先级,如果在容器里面查找IUserService解耦实现类对象优先使用这个进行依赖注入

解决方案二:添加在定义实现类对象的地方(private IUserService userService2;)

@Autowired  + Qualifier("userServiceImpl2") 没有顺序要求 ;参数要求:与bean的名字保持一致(bean默认是类名变成小驼峰)

  1. @Autowired 先按类型(IUserService)查找 Bean。
  2. 若找到多个同类型 Bean,再通过 @Qualifier 指定的名称查找。

解决方案三:添加在定义实现类对象的地方(private IUserService userService2;)@Resource

语法:

1.@Resource(name = "userServiceImpl") 参数要求:与bean的名字保持一致(bean默认是类名变成小驼峰)

2.@Resource  无参数时,先按照定义的名字(不是bean,是定义的)进行查找,再按照类型(如果有多个,会抛出异常)

//解决依赖注入存在多个类型对象方案3:这个不是spring框架提供的注解,而是jakartaEE提供的注解,spring框架通过反射解析这个注解赋予DI的功能

总结:

获取bean的方式(重名要在启动类的同一个包下,bean相当于命名都是按照类名小驼峰命名的,与所在包无关,因此重名时要标注)

@Autowired 按类型(@Autowired  + Qualifier("userServiceImpl2") 先名称,名称必须是bean);@Resource按名称(有参必须是bean,无参按定义)

问题:

@Component public class Class1 {} public class Class2 { // 普通类,无 @Component @Autowired private Class1 class1; class2不进行bean的管理, @Autowired会生效吗,原因是什么

@Autowired 的工作原理是通过 Spring 的 BeanFactory 查找匹配的 Bean。普通类不在容器中,无法触发这一查找过程。

  • @Autowired 仅在 Spring 管理的 Bean 中生效
  • 普通类的依赖注入需通过构造函数Setter 方法手动完成。
  • 建议将所有需要依赖注入的类注册为 Spring Bean,遵循 IoC(控制反转)原则。
  • 因此,针对普通类,加入注入依赖的@Autowired也不会生效。


测试类:会自动找到启动类运行spring环境,前提是当前类必须在启动类所在包及其子包下

这个路径指的是逻辑上的

只要测试类在启动类包或子包下,无论层级多深都会被扫描

eg:

启动类: com.itheima包下

测试类:com.itheima包下,com.itheima的子包下均可以被扫描,但是在com.abc这种包下则不会被扫描

mabitas插件生成xml文件,根据下面的关键字生成不同的标签(没有下了含义的可以进行选择,有的则会默认生成对应的)

  • 查询类关键词selectfindgetlist → 生成 <select>
  • 修改类关键词updatemodify → 生成 <update>
  • 插入类关键词insertadd → 生成 <insert>
  • 删除类关键词deleteremove → 生成 <delete>

根据返回值类型推断

  • 返回实体类 / 集合 → 生成 <select>(需指定 resultType resultMap
  • 返回 int(影响行数) → 生成 <update>/<insert>/<delete>
  • 返回 void → 通常生成 <update>/<insert>/<delete>

MyBatis 的#{}${}的对应关系

  • #{}:底层使用预编译语句,将参数替换为占位符 ?,因此只能用于参数值(参数值就是字面意思)
  • ${}:直接进行字符串替换,因此可以用于生成标识符,但存在 SQL 注入风险。


场景

是否可用占位符 ?

MyBatis 方式

示例

表名、列名

${}

SELECT ${field} FROM ${table}

WHERE 条件值

#{}

WHERE id = #{id}

ORDER BY 字段

${}

ORDER BY ${sortField}

标识符(Identifiers)

  • 定义:SQL 中用于命名对象的名称,如:
  • 表名:usersorders
  • 列名:idusernamecreate_time
  • 别名:SELECT u.name FROM users AS u 中的 u

总结:${} 可以动态传入,但是容易被sql注入,因为其是进行字符替换

#{},只能传参数值,,本质是占位符?替换,无法替换标识符

相关文章
|
网络协议
用 ipv6 和端口号发起 http 请求
用 ipv6 和端口号发起 http 请求
|
6月前
|
JavaScript 前端开发 Go
web-2
CSS 样式通过选择器定义元素外观,属静态样式;JS 样式通过操作 DOM 实现动态修改。两者在语法、作用方式及应用场景上存在差异,CSS 侧重布局与视觉表现,JS 则用于交互与动态逻辑控制。
|
6月前
|
SQL XML JSON
在了解三层架构
该文档详细介绍了在Java开发中,如何使用注解定义Mapper接口并实现数据库操作,包括SQL语句的编写与字段映射处理。同时涵盖了Service层的接口与实现类的结构,以及Controller层的请求处理方式,涉及RESTful API设计、参数绑定、数据传递与响应封装等内容,适用于基于Spring框架的Web应用开发。
|
7月前
|
自然语言处理 开发者 Python
Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位
Django国际化与本地化指南,涵盖i18n和l10n的定义、配置、视图与模型中的翻译使用、消息文件生成与编译,以及多语言登录实战。助你打造多语言支持的Web应用。
342 0
|
6月前
|
安全 Java 关系型数据库
nacos 升级指北 草履虫级教程
本文记录了Nacos从2.4.1升级至2.5.1的完整步骤,适用于使用MySQL持久化、JDK8、Linux环境及Jar包部署的情况。内容包括升级前的版本兼容性调查、数据库与配置备份、升级操作流程及回滚方案,确保升级过程安全可控。
|
6月前
|
Java Linux 应用服务中间件
dock与linux
本文介绍了 Linux 常用命令与 Docker 的基本操作,涵盖文件管理、权限修改、日志查看、容器管理、镜像构建及 Docker Compose 编排等内容,帮助开发者快速掌握项目部署与服务管理技能。
|
前端开发 JavaScript API
现代Web开发中的前后端分离架构
本篇文章探讨了前后端分离架构在现代Web开发中的应用与优势。
|
移动开发 前端开发 JavaScript
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
23808 3
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
|
存储 编解码 开发工具
拉取RTSP流后的几个去向探讨(播放|转RTMP|轻量级RTSP服务|本地录制|GB28181)
本文汇总了大牛直播SDK在Android平台上拉取RTSP流后的多种应用方向,包括本地播放、转推至RTMP服务器、轻量级RTSP服务、GB28181平台及录像等功能。提供了详细的实现方法与示例代码,旨在帮助开发者高效利用RTSP流数据,实现低延迟、稳定且灵活的应用场景。
671 1