【Spring】 IoCDI

news2024/9/23 19:19:53

 回顾

企业命名规范

大驼峰:BookDao(首字母都大写)

类名

小驼峰:bookDao(第一个字母小写)

方法名

蛇形:book_dao(小写+下划线_)

数据库

串形:book-dao(小写+连字符-)

项目文件夹

各种注解

学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解

a. @RequestMapping: 路由映射

b. @RequestParam: 后端参数重命名

c. @RequestBody: 接收JSON类型的参数

d. @PathVariable: 接收路径参数

e. @RequestPart: 上传⽂件

f. @ResponseBody: 返回数据

g. @CookieValue: 从Cookie中获取值

h. @SessionAttribute: 从Session中获取值

i. @RequestHeader: 从Header中获取值

 j. @Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回 视图.

k. @RestController: @ResponseBody + @Controller 返回数据

好用的工具插件

Java EE学习阶段会涉及较多⼯具, 插件的学习, 来帮助我们提⾼开发效率. ⽐如Postman, lombok, EditStarter, 后⾯还会继续学习其他的⼯具或插件. 

一.Spring

Spring两大核心思想

1.IoC

2.AOP

1.IoC控制反转

Inversion of Control 控制反转,Spring是一个控制反转的容器.(spring拥有了创建对象的控制权)

举一个例子来理解什么是控制反转?

我们要造一辆汽车,汽车依赖车身,车身依赖底盘,底盘依赖轮子.

由于层层的依赖关系,程序的耦合度非常高,此时如果我们想改变位于底层的轮胎的大小,或者增加轮胎的属性,整个调用链上的所有代码都需要修改.这当然是是一个问题.

如果我们转变思路:先根据汽车的样子设计车身,再根据车身设计底盘,根据底盘设计轮子. 这个时候,他们的依赖关系就完全倒置了: 轮子依赖底盘,底盘依赖车身,车身依赖汽车.

实现:将所需要的依赖从原来创建下级类的方式改为传递/注入的方式,此时我们不需要关注下级类的属性变化,传递过来的是什么,我们就接受什么,此类本身并不需要修改代码.这也完成了程序的解耦!

IoC方式和传统方式的对比

传统开发对象的创建顺序: Car  -  FrameWork -  Bottom  -  Tire

改进之后的创建对象顺序:Tire  -  Bottom  -  Framework  -  Car

改进之后的控制权发生了反转,不再是使用方对象创建并控制依赖对象了,而是把依赖对象注入到当前对象中,依赖对象的控制权不再由当前类控制.

这也就是IoC的实现思想.


IoC容器的优点

资源不再由使用双方管理,而是由第三方管理

1.资源集中管理:IoC容器会帮我们管理一些资源对象,需要时,去容器中去取就可以了

2.解耦合:降低了使用资源双方的依赖程度,创建实例的时候不需要了解其中的细节

总结:Spring是一个包含众多工具的IoC容器,来帮助我们做资源管理.

IoC是一种思想,DI是IoC的一种实现方法.

2.DI依赖注入

Dependency Injection依赖注入

容器在运行期间,动态地为应用程序提供运行时所依赖的资源.

上述代码中就是通过构造函数的方式,把依赖对象注入到使用的对象中.

二.IoC 和 DI 的使用

Spring作为一个IoC容器,它具备两个最基础的功能,那就是存和取;

存和取的其实就是spring容器帮管我们管理的对象,我们把他们称之为Bean.

这些对象交由Spring管理,由Spring来负责对象的创建和销毁.

我们要做的分两步:

1.告诉Spring,哪些需要存

添加@Component注解(例)

2.知道如何从Spring取出对象

添加注解@Autowired

比如:

原本在UserController类中要使用UserDao对象,就需要new出UserDao对象,但是现在我们也可以将UserDao交给Spring管理了, 具体的实现只需要两步 : 

1.告诉Spring帮我们管理UserDao 

在类上面添加@Component注解

2.从Spring中获取UserDao对象

在对象声明时添加@Autowired注解

Bean的存储

上述IoC容器创建和管理对象的过程也就是bean的存储.

前面我们使用的是@Component注解来把对象交给IoC容器管理,而Spring框架为了更好服务web应用程序,提供了更更富的注解.

1.类注解(五大注解)

@Controller

控制层存储

@Service

服务存储

@Repository

仓库存储

@Component

组件存储

@Configuration

配置存储

1.1@Controller

使用@Controller存储bean:
 

从Spring上下文中获取bean对象的三种方式:

先获取到Spring上下文,再调用getBean方法.

  • getBean(Class)

  • getBean(String s)

这种要强转 .

特殊情形:如果类名前两位都是大写,那么不用变,直接使用原名

  • getBean(String , Class)

bean名的约定

类名: UserController, Bean的名称为: userController

类名: AccountManager, Bean的名称为: accountManager

类名: AccountService, Bean的名称为: accountService

特殊情况, 当有多个字符并且第⼀个和第⼆个字符都是⼤写时, 将保留原始的⼤⼩写.

⽐如

类名: UController, Bean的名称为: UController

类名: AManager, Bean的名称为: AManager

1.2@Service

1.3@Repository

1.4@Component

1.5@Configuration

上述四个注解和@Controller也是相同的使用方法.

为什么要这么多注解

其实注解和分层式呼应的.不同的注解对应不同的用途.

  • @Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应.
  •  @Servie:业务逻辑层, 处理具体的业务逻辑.
  • @Repository:数据访问层,也称为持久层. 负责数据访问操作
  •  @Configuration:配置层. 处理项⽬中的⼀些配置信息

注解之间的关系

  • @Controller / @Service / @Repository / @Configuration 这四个注解的源码里都有一个@Component , 说明它们本身就是属于@Component的 " 子类 " ,@Component 是⼀个元注解,@Controller , @Service , @Repository 等. 这些注解被称为 @Component 的衍⽣注解.
  • @Controller , @Service 和 @Repository ⽤于更具体的⽤例(分别在控制层, 业务逻辑层, 持 久化层), 在开发过程中, 如果你要在业务逻辑层使⽤ @Component 或@Service,显然@Service是更 好的选择.
  • 只有@controller注解才可以被其他类访问到,这是controller的特殊功能.

ApplicationContext  和 BeanFactory

BeanFactory

获取bean对象其实是父类BeanFactory提供的功能.

  • 它们都是Spring容器的的顶级接口,其实BeanFactory提供了基础的访问容器的能力,ApplicationContext属于BeanFactory的子类,继承了BeanFactory的所有功能,并且还拥有独立的特性,添加了国际化支持/资源访问支持/时间传播

  • 性能:applicationContext是一次性加载并初始化所有Bean对象,而BeanFactory是懒加载,需要用到才会去加载,因此更轻量.

2.方法注解@bean

五大注解只能加载类上,并且只能加在自己的代码上

若想获取一个类的多个bean时,不能使用类型来获取对象. 否则会取到同一个对象.

2.1获取第三方类

由于五大注解只能加在自己写的类上,对于一些第三方的包,我们只能通过方法注解来获取第三方类

假如这是一个第三方类:

  • 方法注解必须搭配五大注解使用!

  • 一个类包含多个bean,只能使用bean名称获取

2.2bean传参

Bean会根据名称匹配. 但是如果对应类型的对象只有一个时,就不会看名称,而是直接赋值 .

(比如只有一个String类型的bean,此时参数就是一个String类型,那么就会直接用这个唯一的String类型的bean,而不会看名称匹配)


springBoot特点有一个特点是约定大于配置

体现:扫描路径

默认的扫描路径是启动类所在目录以及子目录.

另外,@ComponentScan("") 可以指定扫描路径.

如果没有指定,使用默认的扫描路径.

三.DI详解

依赖注入/属性装配

1.属性注入@Autowired

属性注入以类型进行匹配,与注入的属性名称无关

注意:无法注入final修饰的属性.

@Autowired的问题:如果一个类型存在多个对象,优先名称匹配,如果名称都匹配不上,那就会报错.

解决方式:

1.属性名和需要使用的对象名保持一致.(使用名称匹配)

2.使用@Primary注解表示默认的bean

3.使用@Qualifier来指定bean

4.使用@Resource来指定bean

@Autowired和@Resouce的区别

  • @Autowired是spring框架的注解,而@Resource是JDK提供的注解.
  • @Autowried是默认是按照类型注入,如果类型一样,优先按照名称匹配,而@Resource是按照名称注入,它可以设置name属性来获取bean

2.构造方法注入

如果只有一个构造函数,@Autowired可以省略

如果存在多个构造方法,需要加@Autowired注明使用哪个构造方法

3.Setter方法注入

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

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

相关文章

计算机中文编程工具构件之透明按钮,编程工具下载,零基础自学编程

计算机中文编程工具构件之透明按钮,编程工具下载,零基础自学编程 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件&am…

HashML——让更多企业读懂数据,用好AI

随着大模型技术的兴起,数据智能和AI正成为企业数字化转型的新驱动力。 酷克数据研发推出的新一代高级分析和数据科学工具箱HashML自推出以来,受到了众多企业和技术爱好者的广泛关注。在最近的直播中,我们邀请了HashData的数据科学工程师&…

目标检测算法 - YOLOv3

文章目录 1. Backbone Darknet-532. 整体架构3. 损失函数4. 训练过程5. 预测过程 YOLOv1、YOLOv2都是在CVPR这种正规的计算机视觉学术会议上发表的正式学术论文。 YOLOv3不算一篇严谨的学术论文,是作者随笔写的技术报告。 YOLOv3性能: 1. Backbone Dark…

七要素微气象仪气象数据监测助手

WX-WQX7 随着科技的发展,气象预测的准确性已成为人们日常生活的重要参考。而七要素微气象仪,作为新型的气象探测设备,以其精细化的数据测量和解析能力,正在改变我们的天气预测方式。 一、产品介绍 七要素微气象仪是一款集成了温…

STM32:基本定时器原理和定时程序

一、初识定时器TIM 定时器就是计数器,定时器的作用就是设置一个时间,然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能,还可以实现捕获脉冲宽度,计算PWM占空比,输出PWM波形&am…

TEMU平台商品欧盟站要求电子和电气产品提供CE-EMC(Electric)资质

CE-EMC认证是欧盟对于市场上销售的电子和电气产品所要求的一个重要认证标准。该认证指令规定了产品在电磁环境下的辐射和抗干扰性能要求,以确保产品在使用时不会对其他设备和系统产生干扰,并且能够正常工作,不受其他设备的干扰。 CE EMC认证…

【机器学习 | 白噪声检验】检验模型学习成果 检验平稳性最佳实践,确定不来看看?

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统,每秒处理的数据量高达数百万,而机器模型一般比较笨重,虽然功能强大,但是qps一般都比较低,日常工作中,我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

【Mysql学习笔记】3 - 本章作业

1.判断 1. 这句话表示ename as name 可以不要这个as&#xff0c;同理后面的sal salary也是别名&#xff0c;而选项D的Annual Salary中间也有空格&#xff0c;程序会判断为as 但as不能连用&#xff0c;所以错误&#xff0c;选D 2.选B&#xff0c;因为null不能加上判断符号<&…

shell(函数和数组)

目录 一、函数 1.函数的由来 2.函数的作用 3.函数的使用方法 4.函数的定义 5.查看函数 6.删除函数 7.函数返回值 8.函数的传参数 9.函数递归 二、数组 1.数组的相关介绍 2.声明数组 3.定义数组的格式 4.冒泡排序 总结&#xff1a;本章主要介绍了函数和数组相关知…

Redis集群主备切换原因排查

背景 线上redis部署的是三主三集群&#xff0c;昨天中午&#xff0c;线上各服务接连告警&#xff0c;提示服务已下线&#xff0c;过一段时间又上线了&#xff08;springboot-admin企业微信服务下线、上线告警&#xff09;&#xff0c;赶紧放下手中外卖排查。 排查 1. 查看各…

unreal 指定windows SDK

路径 &#xff1a; “C:\Users\Administrator\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml” 在Configuration中添加 <WindowsPlatform><WindowsSdkVersion>10.0.20348.0</WindowsSdkVersion></WindowsPlatform>示例&…

什么是高防IP?如何进行防护?怎样隐藏源站?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;是目前最常用的一种防御DDoS攻击的手段。用户在数据不转移的情况下&#xff0c;就可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;防护系…

objdump反汇编文件解析

命令使用 objdump可以对可执行文件进行反汇编 其常用参数为: objdump -d <file(s)>: 将代码段反汇编&#xff1b;objdump -S <file(s)>: 将代码段反汇编的同时&#xff0c;将反汇编代码与源代码交替显示&#xff0c;编译时需要使用-g参数&#xff0c;即需要调试信…

R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析

很久很久以前给大家写过决策树&#xff0c;非常简单明了的算法。今天给大家写随机&#xff08;生存&#xff09;森林&#xff0c;随机森林是集成了很多个决策数的集成模型。像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思想还是非常好的。…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SCN随机配置网络多变量回归预测 1.data为数据集&#xff0c;7个输入特征&#xff0…

二十、索引库

目录 一、Mapping属性 二、创建索引库 1、在DevTools中编写代码 2、运行并查看 三、查询索引库 1、查询索引库语法&#xff1a; 四、删除索引库 1、删除索引库语法 五、修改索引库 一、Mapping属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括:…

Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来 )

Jquery ajax 同步阻塞引起的UI线程阻塞的坑&#xff08;loading图片显示不出来&#xff0c;layer.load延迟&#xff09;jax重新获取数据刷新页面功能&#xff0c;因为ajax属于耗时操作&#xff0c;想在获取数据且加载页面时显示加载遮罩层&#xff0c;结果发现了ajax的好多坑。…

代码随想录算法训练营第五十二天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 1143.最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:dp [[0] * (len(text2) 1) for _ i…

Modbus故障码速查手册(故障码含义、分析原因、详细解读)

Modbus故障码速查手册 文章目录 Modbus故障码速查手册引言故障码表故障详解0x01 IllegalFunction0x02 IllegalDataAddress0x03 IllegalDataValue0x04 SlaveDeviceFailure0x05 Acknowledge0x06 SlaveDeviceBusy0x08 MemoryParityError0x0A GatewayPathUnavailable0x0B GatewayTa…