[spring]应用分层 及 Spring IoCDI

news2024/11/15 11:06:00

文章目录

  • 一. 应用分层
  • 二. Spring IoC
    • 获取String中的对象
    • 五大 类注解
      • 1. @Controller (控制器存储)
      • 2. @Service(服务存储)
      • 3. @Repository(仓库存储)
      • 4. @Conponent(组件存储)
      • 5. @Configuration(配置存储)
    • 方法注解@Bean
      • 定义多个对象
      • 重命名
  • 三. Spring DI
    • 属性注入
    • 构造方法注入
    • Setter注入
    • @Autowired存在的问题

一. 应用分层

Spring MVC, 就是把整体的系统分成了 **Model(模型), View(视图)和Controller(控制器)**三个层次,也就是将⽤⼾视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是⼀种标准的软件分层架构

而⽬前现在更主流的开发⽅式是 “前后端分离” 的⽅式, 后端开发⼯程师不再需要关注前端的实现, 所以对于Java后端开发者, ⼜有了⼀种新的分层架构: 把整体架构分为控制层(Controller)、业务逻辑层(Service)和数据层(Dao). 这种分层⽅式也称之为"三层架构"
在这里插入图片描述
二者的关系:
在这里插入图片描述

应用分层的好处:
• 降低层与层之间的依赖, 结构更加的明确, 利于各层逻辑的复⽤
• 开发⼈员可以只关注整个结构中的其中某⼀层, 极⼤地降低了维护成本和维护时间
• 可以很容易的⽤新的实现来替换原有层次的实现
• 有利于标准化

二. Spring IoC

在这里插入图片描述
我们在应用分层之后, 我们如果要用其他类的方法, 就需要创建这个类对象, 然后才能通过对象调用方法

IoC: Inversion of Control (控制反转)
Spring 是包含了众多⼯具⽅法的 IoC 容器
也就是说 Spring 是⼀个"控制反转"的容器, 反转的是对象的控制权

在使用某个类时, 我们可以通过IoC的思想, 将这个类交给Spring, 那么Spring就会帮我们创建这个类对象(Bean)

获取String中的对象

在这里插入图片描述
这时创建项目时, 默认创建的启动类, 用@SpringBootApplication标识
项目运行时, 会从这个启动类开始扫描, 扫描的范围就是这个类所在的包和子包

因为@SpringBootApplication这个注解, 包含了@ComponentScan
在这里插入图片描述
这个注解就标识了需要扫描的包的路径, 默认就是@SpringBootApplication所在的路径
如果需要扫描特定的路径, 可以通过@ComponentScan来修改
如果没有被Spring扫描到, 那么下面的IoC和DI 都不会起作用的

我们可以接收这个返回值, 使用getBean方法拿到Spring框架中的对象
在这里插入图片描述
目前, 我们可以通过三种方式获得Spring中的对象

  1. 通过类对象
  2. 通过对象名
    对象名在Spring标准中, 默认规定:
    如果类名采用大驼峰的方式命名, 那么对象名就是把大驼峰改成小驼峰
    如果类名前两个字母都是大写, 那么对象名就是类名
  3. 通过对象名和类对象

想要把类对象交给Spring创建, 需要用注解来标识
在这里插入图片描述

五大 类注解

1. @Controller (控制器存储)

@Controller相当于是一个接口, @Controller标识的类, 通常是控制器, 用来和前端进行交互, 这时其他注解所不具备的功能
在这里插入图片描述
通过三种方式来获取对象
在这里插入图片描述
运行结果:
在这里插入图片描述
发现, 获取成功, 而且获取的都是同一个对象
说明: Spring创建的是单例对象

2. @Service(服务存储)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. @Repository(仓库存储)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. @Conponent(组件存储)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5. @Configuration(配置存储)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为什么要这么多注解?
这个也是和咱们前⾯讲的应⽤分层是呼应的. 让程序员看到类注解之后,就能直接了解当前类的⽤途.
• @Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应.
• @Servie:业务逻辑层, 处理具体的业务逻辑.
• @Repository:数据访问层,也称为持久层. 负责数据访问操作
• @Configuration:配置层. 处理项⽬中的⼀些配置信息
在这里插入图片描述

注解之间的关系:
在这里插入图片描述
其他所有的类, 都包含了@Component注解, 其余四个注解, 都是@Component的衍生注解, 也就是说, 其他的注解, 都可以使用@Component来代替, @Component是个"万能注解"(但是不能代替@Controller), 但并不建议这个做, 建议按照规范使用

方法注解@Bean

方法注解要搭配类注解使用才能生效
方法注解就相当于把我们创建好的这个对象, 交给Spring容器

在这里插入图片描述

可以通过类对象的方式拿到对象, 也可以通过对象名的方式拿到对象
此时, 对象名就是方法名
在这里插入图片描述
在这里插入图片描述

定义多个对象

那么, 就可以通过这种方式, 将多个类对象交给Spring
在这里插入图片描述
通过方法名区分不同对象:
在这里插入图片描述

在这里插入图片描述

重命名

如果想要更换对象名, 也可以通过:
在这里插入图片描述
或定义多个名字:
在这里插入图片描述

三. Spring DI

依赖注⼊是⼀个过程,是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源,⽽资源指的就是对象
简单来说, 就是把对象取出来放到某个类的属性中
使用**@Autowired注解**实现
在这里插入图片描述

属性注入

我们要将 Service 类注⼊到 Controller 类中
先确保Service对象在容器中
在这里插入图片描述
将 Service 类注⼊到 Controller 类中
在这里插入图片描述
如果注入成功, 那么就会打印service的sayHi
在这里插入图片描述

那么, Controller就拿到了Service的对象

构造方法注入

在这里插入图片描述
注意事项:
如果类只有⼀个构造⽅法,那么 @Autowired 注解可以省略, 因为当构造UserController对象时, 会自动在Spring中搜索UserService对象
如果类中有多个构造⽅法,那么需要添加上 @Autowired 来明确指定到底使⽤哪个构造⽅法, 因为Spring创建对象默认调用无参构造函数

Setter注入

在这里插入图片描述
三种注⼊优缺点分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Autowired存在的问题

当同一类型的Bean存在多个时, 使用@Autowired会存在问题
在这里插入图片描述
报错的原因是, 非唯一的Bean对象
共有四种解决方案:
** 1. @Primary**
被@Primary标注的Bean, 表示默认的对象, 当多个同类型对象存在时, 默认注入这个对象
在这里插入图片描述
2. @Qualifier
@Qualifier必须搭配@Autowired使用, 指定要注入的Bean对象的名称

在这里插入图片描述
3. 命名时直接使用Bean对象的名称
在这里插入图片描述

4. @Resourse
@Resourse 是JDK提供的注入注解, 同样可以进行注入
注入时, 指定注入对象的名称
在这里插入图片描述

注入Bean的流程:
在这里插入图片描述

常见面试题:
@Autowird 与 @Resource的区别
• @Autowired 是spring框架提供的注解,⽽@Resource是JDK提供的注解
• @Autowired 默认是按照类型注⼊,⽽@Resource是按照名称注⼊. 相⽐于 @Autowired 来说, @Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。

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

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

相关文章

排序-----归并排序(递归版)

核心思想:假设数组前后两部分各自有序,然后各定义两个指针,谁小谁放到新开辟的数组里面,最后把新开辟的数组赋值给原数组就完成了。要使前后两部分有序就采用递归的方式,不断往下划分块,最后一层划分为两个…

springboot实战学习(7)(JWT令牌的组成、JWT令牌的使用与验证)

接着上篇博客的学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验的基础上,基本完成用户模块的登录接口的主逻辑以及提到了问题:"用户未登录,需要通过登录,获取到令牌进行登录认证,…

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好,代码也耦合度也低,但是我有个简单的写法同样能实现一样的效果,所以我就充分发挥了一下主观能动性 相较于基本功能,这一版做出了如下改动 1.限制了对象池最大数量,多出来的…

Pybullet 安装过程

Pybullet 安装过程(windows) 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件,直接装之前检查下,要不会报缺少某版本MVSC的error,最好的方式是直接下载visual studio,直接按默认…

多无人机通信(多机通信)+配置ssh服务

目录 多机通信 设备 主从机通信设置 配置从机 配置主机 测试 正式启用 MAVROS通信 多机通信 多机通信是实现机器人编队的基础,通过网络搭建通信链路。我们这里用中心节点网络通信,所有数据需有经过中心节点,所以,中心节点…

【有啥问啥】探索累计推理(Cumulative Reasoning, CR)——大型语言模型中的复杂推理新框架

探索累计推理(Cumulative Reasoning, CR)——大型语言模型中的复杂推理新框架 引言 随着人工智能(AI)的快速发展,大型语言模型(LLMs)在自然语言处理上的表现令人瞩目。然而,LLMs在…

实现人体模型可点击

简化需求:实现项目内嵌人体模型,实现点击不同部位弹出部位名称 一:优先3d, 方案:基于three.js,.gltf格式模型,vue3 缺点:合适且免费的3d模型找不到,因为项目对部位有要…

深度学习——D2(数据操作)

N维数组 创建数组 访问元素 一列: [ : , 1 ] 反向累积、正向累积(自动求导) 梯度 梯度(Gradient)是微积分中的一个重要概念,主要用于描述一个函数在某个区域内的变化情况。以下是对梯度的详细解释: 一…

树莓派pico上手

0 介绍 不同于作为单板计算机的树莓派5,树莓派 pico 是一款低成本、高性能的微控制器板,具有灵活的数字接口。主要功能包括: 英国树莓派公司设计的 RP2040 微控制器芯片双核 Arm Cortex M0 处理器,弹性的时钟频率高达 133 MHz26…

Qt笔记(十七)cmake编译Qt项目

Qt笔记(十七)cmake编译Qt项目 1. 文件内容与文件结构1.1.文件目录1.2. CMakeLists.txt内容1.3. main.cpp文件1.4. mouseevent.h1.5. mouseevent.cpp1.6. 生成Visual Studio项目后编译报错1.7. 界面显示中文乱码问题 1. 文件内容与文件结构 1.1.文件目录…

神奇的可变模板参数的应用(C++标准库双向链表 list 中的emplace函数实现)

我们先来看一个可以构造任意对象的函数&#xff1a; /// <summary> /// 可以构造任意对象的函数 /// </summary> /// <typeparam name"MyClass">要转换对象的类型</typeparam> /// <typeparam name"...MyClassConstructorParameterT…

传输层 II(TCP协议——协议的特点、报文段、连接管理)【★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、TCP 协议的特点 TCP 是在不可靠的 IP 层之上实现的可靠的数据传输协议&#xff0c;它主要解决传输的可靠、有序、无丢失和不重复问题。TCP 是 TCP/IP 体系中非…

使用Stream实现事件流

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了Flutter中的异步操作&#xff0c;本章回中将介绍Flutter中的事件流.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在上一章回中介绍了异步操作相关的内容&#xff0c;本章回中将介绍如何把…

施耐德EcoStruxure Machine SCADA Expert(EMSE)与SQL数据库连接(十五)

我习惯使用SQL Server 数据库与EMSE进行连接。 用的是sql 2017 关于数据库软件的安装教程 网上一大把。 1.新建数据库 打开数据库管理工具&#xff0c;新建数据库 2.新建表单 &#xff08;ps:这里先做一个小测试-----目的是验证与EMSE软件的链接是否顺畅。) 添加两个元素进去…

图神经网络的新篇章:通用、强大、可扩展的图变换器

人工智能咨询培训老师叶梓 转载标明出处 图变换器&#xff08;Graph Transformers, GTs&#xff09;因其在处理节点间全局依赖关系方面的能力而受到广泛关注。然而&#xff0c;现有的GTs模型在处理大规模图时面临着计算复杂度高、泛化能力有限等问题。为了解决这些问题&#x…

对比评测5款实用在线翻译工具,包括有道在线翻译

大家好&#xff0c;今天咱们来聊聊在线翻译工具。在这个信息爆炸的时代&#xff0c;语言不再是沟通的障碍&#xff0c;多亏了这些强大的翻译神器。今天&#xff0c;我将带大家比较五款热门的在线翻译工具&#xff0c;究竟谁更胜一筹呢&#xff1f;让我们一探究竟&#xff01; …

用友U8CRM relobjreportlist.php SQL注入漏洞复现

0x01 漏洞描述&#xff1a; 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 用友 U8 CRM客户关系管理系统relobjreportlist.php 文件存在SQL注入漏洞&#xff0c;未经身份验证的攻击者通过…

Linux 一些快捷键使用操作技巧

ctrl c : 强制停止 如图仅输入tail命令时程序会卡住&#xff0c;这时就需要强制停止 ctrl d : 退出或者登出 history : 查看历史输入命令 &#xff01;命令 &#xff1a;自动执行上一次匹配前缀的命令 &#xff08;注意不要用这个命令执行太过久远的&#xff0c;容易执行错误…

字节数据转16进制对应十进制数

在数据处理中经常面临字节数据需要转换成不同位宽的十进制数据&#xff0c;尤其是在嵌入式处理中该现象特别常见&#xff0c;这里以转换为16位位宽的十进制为例&#xff0c;采用python校本进行数据转换&#xff0c;具体数据如下&#xff1a; 要将上面数据转换为双字节十进制数…

英语六级-学习

01 英语分值比例 02听力学习 听力练习&#xff0c;基础好选择标准VOA和BBC。基础差选择VOA慢速。 听力内容包括不受政治争议的内容&#xff0c;社会生活类(奇闻趣事、日常生活)、经济类(商务、职场相关)、环保类、互联网类---------根据各类主题快速找到录音材料中心点。 研…