--- spring IOC和DI ---

embedded/2025/4/1 3:56:57/

引言

在写项目的时候每次在调用的对象的时候,都需要先导入对应的包和手动实例化这个对象,如果对象少的话还能接收,但是spring提供了更好的解决方式,spring是一个IOC(控制反转)容器,他可以储存对象,在你需要的时候给你注入(DI)这样就免去了你创建对象的操作,在使用的时候只需要使用一个注解就能轻松创建了,而且还能轻松达到解耦的目的

IoC(Inversion of Control 控制反转)

字面意思的理解就是,本来这个类的控制权是在我自己手中,我需要对象的时候就直接给new一个这个对象,然后使用,而控制反转了之后,这个类的控制权在spring手中了,我要使用的时候,需要从spring这个容器中拿,new这个对象的控制权变为了在spring手中了,并通过申明注入(DI)

对象,这样就轻松的实现了解耦合,比如:

一个简单的造车例子,我需要把轮子的尺寸给car,而如果之后的代码需要改变size这个字段的话比如类型改为long,会发现需要改变car的参数,如果car还有嵌套的话就需要改变的更多了,没有达到解耦的目的,而在spring中只需要,将类交给spring管理就要,需要的时候注入

IoC&DI 使用

IoC

使用类注解@Component注解来修饰需要交给spring管理的对象,会将自定义的类型注册成bean,为了更好的分辨不同层的业务,spring提供了更多的类注释

@Controller(表现层),@Service(业务逻辑层),@Repository(数据层),@Configuration(配置层,一般不属于前面的就使用这个来修饰)

这几个注解只有@Controller只能用于表现层不能和其他的替换,且他们都是基于@Component注解的,功能的实现方式都是相同的

@Bean 方法注解

被@Bean修饰的方法的返回值会被spring注册为一个Bean,默认为单例模式,可以通过Bean名字或类型DI注入来获取这个返回值,如果一个类中需要多个对象和注入外面导入的类的没办法提供注释,那么就可以使用bean注解

获取bean对象

在启动之后,会返回整个bean容器,这是就可以通对于的bean的名字或类型来获取bean对象

通过名字来获取bean是需要遵循一定的格式的

* 获取对象的name在获取时需要遵循一定的规则,储存在bean中的对象一律使用小驼峰的格式,如果类名字前俩个字符为大写,那就保持原来的类名字储存
* 比如 储存 HelloWorld 在bean中是 helloWorld  而储存NHello 在bean中是NHello

扫描路径

在启动的时候,spring默认的扫描路径是启动类所在的路径起向下扫描,如果需要更改他的扫描路径可以使用@ComponentScan("xx.xx.xx"),这样才会把你交给spring管理的对象注册到bean中

DI依赖注入

spring中有三种注入方式 属性注入 构造方式注入 Setter注入

使用@Autowired来注入bean对象

@Autowired 会根据bean的类型来选择注入哪个bean对象,如果在bean中有多个相同类型的对象,直接注入的话spring会不知道要注入那个,比如这种情况

那么就需要我们自己来处理下

@Primary:表示在有相同类型bean的时候注入的是那个bean

注入的是b()这个方法放回的对象

也可以使用 @Qualifier来修改每个bean的名字,他需要和@Autowired配合使用

还可以使用@Resource注解来注入对象,@Resource和@Autowired的最大区别是,@Resource是按bean的名称来注入对象的,而@Autowired是按bean的类型来注入对象的,且@Resourcet提供了更多的参数设置

注入的是名字为b3的bean

@Resource是jdk注解,而@Autowired是spring的注解

Autowired的转配顺序

EDD~~~


http://www.ppmy.cn/embedded/177667.html

相关文章

性能测试核心流程和概念

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 在很多测试人员的概念中,性能测试就是使用Loadrunner、Jmeter等工具进行压测,然后得到测试结果即可,但仔细想想&#xff0c…

周报参考模板

一、本周工作成果 1、支付系统架构优化 基于策略模式重构支付回调逻辑,支持6种差异化场景(如会员积分发放、优惠券核销),处理效率提升35%。引入RocketMQ实现事件异步处理,日均处理订单量从500提升至2000,消…

Go 语言规范学习(2)

文章目录 VariablesTypesBoolean typesNumeric typesString typesArray typesSlice typesStruct typesPointer typesFunction typesInterface typesBasic interfacesEmbedded interfacesGeneral interfaces【泛型接口】Implementing an interface【实现一个接口】 Map typesCha…

欧几里得距离(Euclidean Distance)公式

欧几里得距离公式 欧几里得距离(Euclidean Distance)是计算两点之间直线距离的一种方法。它是最常见的距离度量方式之一,广泛应用于数学、物理、机器学习、计算机视觉等领域。 公式定义 1. 二维空间 在二维平面上,假设有两个点…

数据结构与算法:2,冒泡排序

以从小到大排序为例: 冒泡排序步骤: 1,从左到右(或从右到左)对比相邻两个数,左边的数 大于 右边的数 则交换位置 2,重复第一个步骤 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​…

Windows 图形显示驱动开发-WDDM 2.7功能-MCDM KM 驱动程序实现指南(四)

查询适配器信息要求 如前所述,仅计算驱动程序必须支持 DxgkDdiQueryAdapterInfo。 必须支持以下 DXGK_QUERYADAPTERINFOTYPE 类型: DXGKQAITYPE_DRIVERCAPSDXGKQAITYPE_NUMPOWERCOMPONENTSDXGKQAITYPE_HISTORYBUFFERPRECISIONDXGKQAITYPE_QUERYSEGMEN…

MyBatis更新操作的“伪成功”陷阱

一、背景现象 1. 问题描述 ① 数据表拆分,双写开启。 数据组监听Binlog变更消息清洗数据,灰度期间发现以updateTime作为分区条件,新老表查询结果数据量相差较大。 取其中一条id,对比新老表数据发现除updateTime外值都相同&…

在K8S中使用ArgoCD做持续部署

一、了解argocd ArgoCD是一个基于Kubernetes的GitOps持续交付工具,应用的部署和更新都可以在Git仓库上同步实现,并自带一个可视化界面。本文介绍如何使用GitArgocd方式来实现在k8s中部署和更新应用服务。关于ci这一块这里不多介绍。主要讲解argocd如何实…