【Spring】 IoCDI

 回顾

企业命名规范

大驼峰: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.mzph.cn/news/164344.shtml

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

相关文章

[Linux] shell脚本的函数和数组

一、函数 1.1 函数的定义 函数是脚本的别名 作用:函数可以避免代码重复,可读性强,可以简化脚本。 格式:函数名(){脚本} 1.2 如何使用函数 1.定义 2.调用 函数一定要先定义再使用 例子&#xff1a…

编译原理Lab1-用FLEX构造C-Minus-f词法分析器

HNU编译原理lab1实验–根据cminux-f的词法补全lexical_analyer.l文件,完成词法分析器。 本文没有添加任何图片,但是以复制输出的形式展现出来了实验结果。 实验要求: 根据cminux-f的此法补全lexical_analyer.l文件,完成词法分析…

国家超级计算济南中心低代码平台应用实践

摘要:文章主要介绍了济南超算使用低代码平台明道云解决了一系列业务问题,包括资产管理、人员与机构管理、流程制度管理等。通过明道云平台,济南超算成功地将不同部门的业务信息进行整合,提高了工作效率和管理水平。文章还强调了明…

计算机端口

前言 计算机端口(Port)是一种用于在计算机网络中标识特定服务或应用程序的机制。 端口是一个数字,范围从0到65535,用于将网络通信分配给不同的应用程序或服务。 在 Internet 协议套件(TCP/IP)中&#xff0…

MG-HSF

作者未提供代码

Go语言中结构体的使用和示例

结构体(简称struct)用于创建不同数据类型的成员集合,放入一个单一的变量中。虽然数组用于将相同数据类型的多个值存储在单一变量中,但结构体用于将不同数据类型的多个值存储在单一变量中。结构体对于将数据组合在一起以创建记录非…

openGL之纹理 :第二课

#include "glew.h" #include "glfw3.h" #include "SOIL2.h"//如何解析输入的数据流 0,1,2 分三部分 GLchar * vertextSrc " #version 330 core \n \layout (location 0) in vec3 position; \layout (location 1) in vec3 col…

【精选】​​通道热点加持的LW-ResNet:小麦病害智能诊断与防治系统

1.研究背景与意义 小麦是世界上最重要的粮食作物之一,但由于病害的侵袭,小麦产量和质量受到了严重的威胁。因此,开发一种高效准确的小麦病害识别分类防治系统对于保障粮食安全和农业可持续发展具有重要意义。 传统的小麦病害识别分类方法主…

Feign

目录 RestTemplate方式调用存在的问题: 定义和使用Feign客户端 自定义Feign的配置 性能优化 Feign的最佳实践 Feign的使用步骤: 1、引入依赖 2、添加EnableFeignClients注解 3、编写FeignClient接口 4、使用FeignClient中定义的方法代替RestTemplate Feign的…

什么是迁移学习

1 迁移学习概述 迁移学习(Transfer Learning)是机器学习中的一种方法,它允许模型将从一个任务中学到的知识应用到另一个相关的任务中。这种方法在数据稀缺的情况下尤为有用,因为它减少了对大量标记数据的需求。迁移学习已成为深度…

Node使用Nvm安装双版本切换(node两个版本同时用怎么办?不同的项目Node版本要求不一样怎么办?)

先把node.js卸载 开始—>添加删除程序—>node npm -v node -v //检查是否还存在,卸载成功就行了NVM下载 github下载 百度网盘下载 打开安装包以管理员身份安装,要是记得这个路径并且必须全是英文 使用nvm安装两个使用的node版本 cmd以管理员…

计算机组成原理2

1.浮点数 2.IEEE 754 3.存储器的性能指标 4.存储器的层次化结构 主存类似手机运行内存8g ,辅存类似手机内存128g.... 辅存必须先通过主存才能被cpu接收,就例如微信打开那个月亮小人界面两三秒就是主存在读取辅存的程序然后被cpu接收运行。 5.主存储…

Greenplum的数据库年龄检查处理

概述 Greenplum是基于Postgresql数据库的分布式数据库,而PG数据库在事务及多版本并发控制的实现方式上很特别,采用的是递增事务id的方法,事务id大的事务,认为比较新,反之事务id小,认为比较旧。 事务id的上…

经典的回溯算法题leetcode组合问题整理及思路代码详解

目录 组合问题 leetcode77题.组合 leetcode216题.组合总和III leetcode40题.组合总和II leetcode39题.组合总和 倘若各位不太清楚回溯算法可以去看我上一篇文章。 回溯算法详解-CSDN博客 组合问题 一般组合和排列类的问题我们都会转化成一个树形问题,更便于…

26. 删除有序数组中的重复项(remove-duplicates-from-sorted-array)

26. 删除有序数组中的重复项(remove-duplicates-from-sorted-array) 给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 …

批量创建表空间数据文件(DM8:达梦数据库)

DM8:达梦数据库 - - 批量创建表空间数据文件 环境介绍1 批量创建表空间SQL2 达梦数据库学习使用列表 环境介绍 在某些场景(分区表子表)需要批量创建表空间,给不同的表使用,以下代码是批量创建表空间的SQL语句; 1 批量创建表空间SQL --创建 24个数据表空间,每个表空间有3个数…

强化学习小笔记 —— 如何选择合适的更新步长

在强化学习中,动作价值函数的更新可以使用增量法,如下所示: Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k − 1 r i ) 1 k ( r k ( k − 1 ) Q k − 1 ) 1 k ( r k k Q k − 1 − Q k − 1 ) Q k − 1 1 k [ r k − Q k − 1 ] \beg…

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 📷 江池…

低代码平台推荐:五大低代码厂商谁的模式更“合适”

随着数字化时代的到来,低代码开发平台作为提高数字生产力的工具正受到越来越多企业的关注,市面上的低代码产品和厂商更是“乱花渐欲迷人眼”。 各家产品不仅功能各有不同,甚至商机都有区别的情况,如何做好产品选型已然成了采购企…

C语言——指针(一)

📝前言 这篇文章主要带大家初步认识一下指针,供大家理解参考。 主要归纳与讲解: 1,指针与指针变量 2,指针的基本使用(如何定义,初始化,引用) 🎬个人简介&…