Spring IoC和DI

目录

一. Spring是什么

IoC

DI

二. IoC&DI的使用

IoC

1.@Controller(控制器存储)

2.@Service(服务存储)

3.@Repository(仓库存储)

4.@Componemt(组件存储)

5.@Configuration(配置存储)

多种类注解的作用

6.@Bean(方法注解)

指定路径注解---@ComponentScan

bean的命名

1.五大注解存储的bean

2.@Bean注解储存

DI

1.属性注入

2.构造方法注入

3.Set方法注入

三种注入方式的优缺点

@Autowired存在问题的解决方式


一. Spring是什么

Spring是一个包含众多工具的IoC容器

容器:Tomcat--->web容器

            List/Map--->数据存储容器

Spring容器装的是对象。

IoC:控制反转

控制权反转,创建对象的控制权。

IoC

IoC的本质是为了解耦合。

举个例子:

建筑汽车时,汽车依赖车身,车身依赖底盘,底盘依赖轮胎。

car--->framework--->bottom--->tire

普通方式:

当想要遭不同轮胎尺寸的车辆时,修改轮胎类,把size设置为轮胎属性。于此同时要修改所有关联的类。

这种方式改动一个属性,需要需改所有关联的代码。

想要修改轮胎属性,而不影响其他的关联类,这个时候使用IoC的方式。

spring提供的IoC的思想:

每个类之间界限清晰,添加一个属性时其他的类关联性弱,Spring IoC需要做的就是管理对象,即实现下面Main方法的作用。

Spring帮助我们管理对象,我们需要做的事情:

1.告诉Spring,帮我们管理哪些对象

2.知道如何取出来这些对象

DI

IoC是一种思想,DI是一种实现方式。(注入依赖)

注入依赖,比如:上面的Car类中,把Framework注入Car中。

二. IoC&DI的使用

@Autowired:(英文:自动装配),用来注入依赖

@Componemt:(英文意为组件,即对象),用来存取对象

以之前的图书管理系统为例:

IoC

1.类注解:@Controller、 @Service、@Repository、@Componemt、@Configuration

2.方法注解:@Bean

1.@Controller(控制器存储)

用@Controller存储bean的代码

2.@Service(服务存储)

用@Service储bean的代码

getBean()提供的三种获取bean的方式

@SpringBootApplication
public class IoCDemoApplication {public static void main(String[] args) {//Spring上下文,返回Spring的运行环境ApplicationContext context=SpringApplication.run(IoCDemoApplication.class, args);//从context中获取beanUserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//按照名称来获取beanUserService userService2 = (UserService)context.getBean("userService");userService2.doService();//根据名称和类型获取beanUserService userService3 = context.getBean("userService", UserService.class);userService3.doService();}}

bean的命名约定:小写字母开头,采用驼峰命名。

特殊情况:如果类名的前两位都是大写,bean的名称不变

eg: UController------> "UController"

3.@Repository(仓库存储)

4.@Componemt(组件存储)

5.@Configuration(配置存储)

多种类注解的作用

这些类注解的用法相似,有这么多的类注解的目的是为了更好的应用分层,根据不同的类注解能直接了解当前类的用途。

@Controller(控制层)、 @Service(业务逻辑层)、@Repository(数据访问层)、@Configuration(配置层)

注解之间的关系

@Controller、 @Service、@Repository都是@Componemt的衍生类,即@Componemt是他们的父类

若想让外界访问到,程序的入口只能使用@Controller

6.@Bean(方法注解)

1.上述五大注解只能加在类上,并且只能加在自己的代码上,当想要引入一个第三方jar包,也希望交给Spring管理

2.当对于一个类想要定义多个对象时,无法用上述五大注解完成。

这两种情况需可以使用@Bean方法注解

使用

1.@Bean必须搭配五大注解使用

2.使用@Bean注解时,一个类型存在多个bean时,不能使用类型获取对象,使用bean的名称获取对象,bean的名称是方法名

@Bean传递参数

如果需要的Bean的类型对应的对象只有一个时,就直接赋值。如果有多个时通过名称来匹配。

指定路径注解---@ComponentScan

SpringBoot的特点:约定大于配置

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

比如:启动类的代码、位置大于我们自己的代码

启动类在哪里就只扫描哪个路径下的文件内容

使用@ComponentScan指定路径

bean的命名

1.五大注解存储的bean

1.前两位名称全为大写,bean名称为类名

2.其他的为类名首字母小写

3.通过value设置属性,@Controller(value=xxx")

2.@Bean注解储存

1.bean名称为方法名

2.通过name属性设置@Bean(name="aaa ","bbb")

DI

对依赖对象的注入,也被叫做“属性装配”、“依赖装配”。

1.属性注入

使用@Autowired

2.构造方法注入

存在无参的构造函数和有参的构造函数时,不加注释会默认使用无参的构造函数

如果存在多个构造函数时,需要加上@Autowired注明使用哪个构造函数

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

3.Set方法注入

三种注入方式的优缺点

1.属性注入

优点:简洁、使用方便

缺点:只能使用IoC容器、不能注入final修饰的属性

2.构造函数注入

优点:可注入final修饰的属性、注入的对象不会被修改;依赖对象在使用前一定会被初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行;通用性好,构造方法是JDK支持的,所以更换任何框架都是试用的。

缺点:注入多个对象时,代码会比较繁琐。

3.Set方法注入

优点:方便实例后,重新对对象进行配置或注入。

缺点:注入对象可能会被改变,因为Setter方法可能会被多次调用,就有被修改的风险;不能注入一个final修饰的属性。

@Autowired存在问题的解决方式

当程序中一个类型有多个对象时,使用@Autowired会报错

解决方式:

1.属性名和需要使用的对象名保持一致

2.使用@Primary注解标识默认的对象

3.使用@Qualifier

指定要使用的属性

4.使用@Resource注解

使用@Autowired和使用@Resource的区别

1.@Autowired是Spring框架提供的,@Resource是JDK提供的

2.@Autowired默认按照类型注入,如果一个类型存在多个对象,按名称匹配不上,就会报错。而@Resource按照名称注入,相比之下@Resource支持更多的参数设置

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

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

相关文章

解决Could not establish connection to : XHR failed

解决Could not establish connection to : XHR failed 问题描述 用vscode用远程连接服务器时总报上面的错误,用xshell和Xftp和vscode终端都可以连上,但是用vscode的ssh连接缺总报错,导致无法连接服务器进行代码调试 一、原因 原因可能是在…

Go json 差异比较 json-diff(RFC6902)

Go json 差异比较 json-diff(RFC 6902) 毕业设计中过程中为了比较矢量图的差异而依据 RFC 6902 编写的一个包,现已开源: Json-diff 使用 go get -u github.com/520MianXiangDuiXiang520/json-diff序列化与反序列化 与官方 json 包的序列化和反序列化不…

AcWing 95. 费解的开关(递推)

题目链接 活动 - AcWing 本活动组织刷《算法竞赛进阶指南》,系统学习各种编程算法。主要面向有一定编程基础的同学。https://www.acwing.com/problem/content/97/ 题解 只要第一行开关的状态确定,则所有开关的状态都可以被推出来。第一行开关总共有种操…

jemeter,同一线程组内,调用cookie实现接口关联

取cookie方式参考上一篇:jemeter,取“临时重定向的登录接口”响应头中的cookie-CSDN博客 元件结构 登录后要执行的接口为“api/get_event_list/”,在该HTTP请求下创建HTTP信息头管理器,配置如下: 执行测试后&#xff0…

【ensp实践】eNSP实战篇(4)用eNSP实验来认识什么是OSPF及OSPF配置?

OSPF目录 写在前面涉及知识一、什么是OSPF?二、OSPF特性(优缺点)2.1 OSPF优点2.2 OSPF缺点 三、OSPF实验3.1 打开ensp,添加设备3.2 建立连线3.3 配置及ospf命令【核心】3.3.1 配置PC机3.3.2 设置命令 3.4 验证效果3.4.1、验证OSPF…

使用JLink仿真器实现调试打印的N种方法

方法一:使用MCU的串口 这是最古老也是最简单的方法。 电脑上面插一个USB转TTL,然后与MCU的UART_RX/UART_TX/GND连接起来。PC端再打开一个串口调试助手。两边的波特率一致,就可以收到MCU发过来的打印信息了。 方法二:使用JLink仿…

【EMNLP 2023】面向Stable Diffusion的自动Prompt工程算法

近日,阿里云人工智能平台PAI与华南理工大学朱金辉教授团队合作在自然语言处理顶级会议EMNLP2023上发表了BeautifulPrompt的深度生成模型,可以从简单的图片描述中生成高质量的提示词,从而使文生图模型能够生成更美观的图像。BeautifulPrompt通…

Android--Jetpack--Databinding源码解析

慢品人间烟火色,闲观万事岁月长 一,基本使用 关于databinding的基本使用请看之前的文章 Android--Jetpack--Databinding详解-CSDN博客 二,xml布局解析 分析源码呢,主要就是从两方面入手,一个是使用,一个…

STM32F407-14.1.0-01高级定时器简介

TIM1 和 TIM8 简介 高级控制定时器(TIM1 和 TIM8)包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。 此类定时器可用于各种用途,包括测量输入信号的脉冲宽度(输入捕获),或者生成输出…

微软NativeApi-NtQuerySystemInformation

微软有一个比较实用的Native接口:NtQuerySystemInformation,具体可以参考微软msdn官方文档:NtQuerySystemInformation, 是一个系统函数,用于收集特定于所提供的指定种类的系统信息。ProcessHacker等工具使用NtQuerySys…

Javascript 数组array赋值与取值

Javascript 数组array赋值与取值 目录 Javascript 数组array赋值与取值 一、数组元素的赋值 1、在创建Array对象时直接赋值 2、利用Array对象的元素下标对数组进行赋值 二、数组元素的获取 一、数组元素的赋值 对数组元素赋值共有2种方法: (1&am…

每日一题,头歌平台c语言题目

任务描述 题目描述:输入一个字符串,输出反序后的字符串。 相关知识(略) 编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。 输入 一行字符 输出 逆序后的字符串 测试说明 样例输入&…

【LVGL】STM32F429IGT6(在野火官网的LCD例程上)移植LVGL官方的例程(还没写完,有问题 排查中)

这里写目录标题 前言一、本次实验准备1、硬件2、软件 二、移植LVGL代码1、获取LVGL官方源码2、整理一下,下载后的源码文件3、开始移植 三、移植显示驱动1、enable LVGL2、修改报错部分3、修改lv_config4、修改lv_port_disp.c文件到此步遇到的问题 Undefined symbol …

react中img引入本地图片的方式

在html文件中,可以直接<img src=./roadBook.png /> 但是在jsx文件中,不支持这种写法 必须这样写 在css样式中 App.css .img{background: url(./img/roadBook.png) }App.js import ./App.css;<div className=img></div> 1.基于es6Module //导入 import…

node14升级node16之后,webpack3项目无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 版本改了好多个的&#xff0c;但是不确定具体是哪几个起作用的&#xff0c;…

解读unity内置的软阴影处理方式

解读unity内置的软阴影处理方式&#xff1a; 参考网址&#xff1a; https://blog.csdn.net/cgy56191948/article/details/105726682 https://blog.csdn.net/weixin_45776473/article/details/119582218 https://tajourney.games/5482/ 上面的博客已经论述了&#xff0c;为何出现…

css的复合选择器(有案例)

目录 复合选择器的描述 后代选择器&#xff08;常用重点&#xff09; 子选择器 并集选择器&#xff08;重点常用&#xff09; 伪类选择器 链接伪类选择器 focus 伪类选择器 知识总结&#xff1a; 案例实现&#xff1a; 复合选择器的描述 在 CSS 中&#xff0c;可以根…

日志门面slf4j和各日志框架

简介 简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架&#xff0c; 其主要意义在于提供接口&#xff0c;具体的实现可以交由其他日志框架&#xff0c;如log4j、logback、log4j2。 对于一般的Java项目而言&#xff…

SpringData JPA 搭建 xml的 配置方式

1.导入版本管理依赖 到父项目里 <dependencyManagement><dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-bom</artifactId><version>2021.1.10</version><scope>…

【C++11】lambda表达式及包装器

一.lambda表达式 1.可调用对象 可调用对象即可以像函数一样被调用的对象&#xff0c;有以下三种&#xff1a; 函数(指针)仿函数对象lambda表达式 tips&#xff1a;调用函数时&#xff0c;既可以用函数名&#xff0c;也可以用函数地址&#xff0c;因为函数名和函数地址是一回事…