SpringBoot Notes

news2024/11/15 7:40:22

文章目录

  • 1 SpringBootWeb快速入门
    • 1.1Spring官网
    • 1.2 Web分析
  • 2. HTTP协议
    • 2.1 HTTP介绍
  • 3
  • 4 SpringBootWeb请求响应
  • 5 响应
  • 6 分层解耦
    • 6.1 三层架构
      • 6.1.1 三层架构介绍
      • 6.1.2 基于三层架构的程序执行流程:
      • 6.1.3 代码拆分
    • 6.2 分层解耦
      • 6.2.1 内聚、耦合
      • 6.2.2 解耦思路
    • 6.3 IOC&DI
      • 6.3.1 IOC详解
        • 6.3.1.1 bean的声明
        • 6.3.1.2 组件扫描
      • 6.1.2 DI详解

1 SpringBootWeb快速入门

1.1Spring官网

https://spring.io

spring家族的技术,都是基于SpringFramework的,SpringFramework中提供很多实用功能,如:依赖注入、事务管理、web开发支持、数据访问、消息服务等。

1.2 Web分析

在这里插入图片描述

浏览器服务器两端进行数据交互,使用http协议

2. HTTP协议

2.1 HTTP介绍

HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。

3

4 SpringBootWeb请求响应

5 响应

6 分层解耦

6.1 三层架构

6.1.1 三层架构介绍

在我们进行程序设计及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。

单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。
在这里插入图片描述
根据上述案例的处理逻辑呢,从组成上分为三部分:

  • 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作。
  • 逻辑处理:负责业务逻辑处理的代码。
  • 请求处理、响应数据:负责,接收页面的请求,给页面响应数据。

按照上述三个组成部分,在我们项目开发中呢,可以将代码分为三层:
在这里插入图片描述

  • Controller控制层。接收前端发送的请求,对请求进行处理,并响应数据
  • Service业务逻辑层。处理具体的业务逻辑
  • Dao数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。

6.1.2 基于三层架构的程序执行流程:

在这里插入图片描述

  • 前端发起请求,由Controller层接收(Controller响应数据给前端)
  • Controller层调用Service层进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)
  • Serivce层调用Dao层(逻辑处理过程中需要用到的数据Dao层获取
  • Dao层操作文件中数据(Dao拿到的数据会返回给Service层)

6.1.3 代码拆分

包名备注作用
控制层包名xxxx.controller接收前端发送请求,对请求进行处理,并响应数据
业务逻辑层包名xxxx.service处理业务逻辑
数据访问层包名xxxx.dao数据访问操作,包含数据的增、删、改、查

三层架构的好处

  1. 复用性强
  2. 便于维护
  3. 利用扩展

6.2 分层解耦

6.2.1 内聚、耦合

内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块间的依赖、关联的程度。
软件设计原则:高内聚低耦合。

6.2.2 解耦思路

解决思路是:

  • 提供一个容器,容器中存储一些对象(例:EmpService对象)
  • controller程序从容器中获取EmpService类型的对象

实现上述解耦操作,涉及到Spring中的两个核心概念:

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

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

6.3 IOC&DI

6.3.1 IOC详解

6.3.1.1 bean的声明

IOC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。

要把某个对象交给IOC容器管理,需要在类上添加注解:@Component
为了更好标识web应用程序中bean对象到归属于哪层,又提供了@Component的衍生注解

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

6.3.1.2 组件扫描

bean想要生效,需要被组件扫描
在这里插入图片描述
运行程序后,报错:
在这里插入图片描述
为什么没有找到bean对象呢?

  • 使用四大注解声明的bean,要想生效,需要被组件扫描注解@ComponentScan扫描
    @ComponentScan注解没有显式配置,但实际上已经包含在引导类声明注解 @SpringBootApplication 中,默认扫描的范围是SpringBoot启动类所在包及其子包

如下结构扫描全部:
在这里插入图片描述

6.1.2 DI详解

依赖注入,指IOC容器要为应用程序提供运行时所依赖的资源,而资源指的就是对象

@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)
入门程序举例:在EmpController运行时,要到IOC容器中找EmpService类型的对象,而IOC容器中刚好有EmpService类型的对象,所以就找到了这个类型的对象完成注入操作。

那如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?
在这里插入图片描述
程序运行会报错
在这里插入图片描述

如何解决上述问题呢?Spring提供了以下几种解决方案:

  • @Primary
    使用@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。
    在这里插入图片描述
  • @Qualifier
    使用@Qualifier注解:指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。
  • @Qualifier注解不能单独使用,必须配合@Autowired使用
    在这里插入图片描述
  • @Resource
    使用@Resource注解:是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。
    在这里插入图片描述

面试题 : @Autowird 与 @Resource的区别

  • @Autowiredspring框架提供的注解,而**@ResourceJDK提供**的注解
  • @Autowired 默认是按照类型注入,而**@Resource按照名称注入**

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

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

相关文章

[LeetCode周赛复盘] 第 333 场周赛20230219

[LeetCode周赛复盘] 第 333 场周赛20230219 一、本周周赛总结二、 [Easy] 6362. 合并两个二维数组 - 求和法1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6365. 将整数减少到零需要的最少操作数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6364. 无平方子集计数1. 题目描…

操作系统闲谈08——系统调用、中断、异常

操作系统闲谈08——系统调用、中断、异常 一、系统调用 IDT - GDT - 系统调用表 找到对应系统调用号将系统调用号以及一些现场信息存入寄存器eax中(ebx、ecx、edx存放其他信息),然后触发软中断(x86中,0x80为中断号&…

设计模式 状态机

前言 本文梳理状态机概念,在实操中状态机和状态模式类似,只是被封装起来,可以很方便的实现状态初始化和状态转换。 概念 有限状态机(finite-state machine)又称有限状态自动机(英语:finite-s…

ThreadLocal知识点总结

什么是ThreadLocal?它的作用是什么? ThreadLocal是线程Thread中属性threadLocals的管理者。 ThreadLocal是Java中lang包下的一个类,可以用于在多线程环境中为每个线程维护独立的变量副本。它的作用是让每个线程都拥有自己的数据副本&#xff…

Java面向对象的特性:封装,继承与多态

Java面向对象的特性 在学习Java的过程是必须要知道的Java三大特性:封装、继承、多态。如果要分为四类的话,加上抽象特性。 封装 1.封装概述 是面向对像三大特征之一(封装,继承,多态) 是面向对象编程语言对客…

语音增强学习路线图Roadmap

语音增强算是比较难的研究领域,从入门到精通有很多台阶,本文介绍一些有价值的书籍,值得反复阅读。主要分为基础类和进阶类书籍,大多都是理论和实践相结合的书籍,编程实践是抓手,让知识和基础理论变扎实。基础书籍《信号…

RT-Thread初识学习-01

1. RT-Thread 简介 1.1 RT-Thread 是什么 据不完全统计,世界有成千上万个 RTOS(Real-time operating system,实时操作系统),RT-Thread 就是其中一个优秀的作品。 RT-Thread 内核的第一个版本是熊谱翔先生在 2006 年…

分布式-分布式存储笔记

读写分离 什么时候需要读写分离 互联网大部分业务场景都是读多写少的,读和写的请求对比可能差了不止一个数量级。为了不让数据库的读成为业务瓶颈,同时也为了保证写库的成功率,一般会采用读写分离的技术来保证。 读写分离的实现是把访问的压…

LeetCode-384-打乱数组

1、列表随机 为了能够初始化数组,我们使用nums保存当前的数组,利用orignal保存初始化数组。为了实现等可能随机打乱,考虑到随机数本质上是基于随机数种子的伪随机,我们采用如下的方式实现等可能随机:我们将所有元素压…

MySQL备份恢复(十二)

文章目录1. MySQL数据损坏类型1.1 物理损坏1.2 逻辑损坏2. DBA运维人员备份/恢复职责2.1 设计备份/容灾策略2.1.1 备份策略2.1.2 容灾策略2.2 定期的备份/容灾检查2.3 定期的故障恢复演练2.4 数据损坏时的快速准确恢复2.5 数据迁移工作3. MySQL常用备份工具3.1 逻辑备份方式3.2…

【scl】博图程序的导入和导出

导入或者导出博图文件的方法(也叫移植文件) 目录 前言 ​编辑 ​编辑 前言 本篇文章主要写一下关于博图文件的导入和导出,具体要怎么样才能将写好的程序或者块移植到其他地方,下面我们一起来看! 一、程序块的导入和导…

[软件工程导论(第六版)]第4章 形式化说明技术(课后习题详解)

文章目录1. 举例对比形式化方法和欠形式化方法的优缺点。2. 在什么情况下应该使用形式化说明技术?使用形式化说明技术时应遵守哪些准则?3. 一个浮点二进制数的构成是:一个可选的符号(+或-)&…

Seata分布式事务框架-AT模式与TCC模式介绍

Seata分布式事务框架-AT模式介绍 Seata AT事务方案 Seata 的 AT 模式(Automatic Transaction)是一种无侵入的分布式事务解决方案。下面结合具体业务场景来分析其执行的原理。 业务场景 订单系统 当用户下订单时,执行以下三步流程&#x…

【NLP开发】Python实现聊天机器人(Selenium、七嘴八舌)

🍺NLP开发系列相关文章编写如下🍺:1🎈【NLP开发】Python实现词云图🎈2🎈【NLP开发】Python实现图片文字识别🎈3🎈【NLP开发】Python实现中文、英文分词🎈4🎈【…

XSS注入进阶练习篇(二)DOM型XSS注入深入

DOM型XSS注入深入1. SVG 劫持JS执行1.1 DOM树的概念与构建过程1.1.1 什么是DOM树?1.1.2 DOM树的构建过程1.2 探究img失败的原因1.3 svg标签劫持innerhtml2. details标签 特定条件下劫持JS执行2.1 事件触发流程2.2 实例3.DOM clobbering 绕过3.1 什么是DOM clobberin…

Redis内存回收

Redis 内存回收 Redis之所以性能很强&#xff0c;最主要的原因是基于内存存储&#xff0c;然而单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能 可以通过修改配置文件来设置Redis的最大内存 maxmemory <bytes>当内存达到上限时&#xff0c;就…

营销狂人杜国楹的两大顶级思维

“营销狂人”小罐茶 杜国楹两大顶级思维 1.一定要有【参照物思维】 2.一定要有【终局思维】 趣讲大白话&#xff1a;大牛的思考就是不同 *********** 杜国楹对茶行业思考 1.参照咖啡、酒的发展路径 2.中国茶工业化,品牌化是唯一壮大之路 3.龙头企业必须全品 没有参照物思维就没…

Python将内容写入文件的方法总结。

使用Python写入文件是我们coder的日常&#xff0c;本篇带你详细看一下python将内容写入文件的方法以及细节。主要包括write()方法、writelines() 方法、print() 函数、使用 csv 模块、使用 json 模块。 目录 一、write()方法 二、writelines() 方法 三、print() 函数 四、使…

【Java】中的各种锁

Java提供了种类丰富的锁&#xff0c;每种锁因其特性的不同&#xff0c;在适当的场景下能够展现出非常高的效率。 一、Java锁是什么&#xff1f;为什么要用Java锁&#xff1f; 在并发编程中&#xff0c;经常遇到多个线程访问同一个共享资源 &#xff0c;这时候作为开发者必须考…

【汇编】一、环境搭建(一只 Assember 的成长史)

嗨~你好呀&#xff01; 我是一名初二学生&#xff0c;热爱计算机&#xff0c;码龄两年。最近开始学习汇编&#xff0c;希望通过 Blog 的形式记录下自己的学习过程&#xff0c;也和更多人分享。 这篇文章主要讲述汇编环境的搭建过程。 话不多说~我们开始吧&#xff01; 系统环…