详解原生Spring中的控制反转和依赖注入-构造注入和Set注入

😉😉 学习交流群:
✅✅1:这是孙哥suns给大家的福利!
✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料
🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取!
🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞
💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞
文章目录
一:Spring中的注入
1:什么是注入
2:为什么注入
3:如何注入?
4:注入好处
5:Spring注入的过程
编辑二:Set注入详解
1:JDK内置类型
2:用户自定义类型
(一):第一种方式
(二):第二种方式
3:Set注入简化写法
(一):基于属性的简化
(二):基于p空间简化属性
三:构造注入
1:开发步骤
2:构造方法的重载
3:注入的总结
四:反转控制和依赖注入
1:什么叫做控制反转
2:什么是依赖注入
一:Spring中的注入
1:什么是注入
注入就是通过Spring的工厂类和spring的配置文件,对Spring所创建的对象进行赋值,为成员变量进行赋值
2:为什么注入
为什么需要Spring工厂创建对象的时候给对象进行赋值呢?
1:通过配置文件进行注入也可以实现解耦合的这样的作用,直接写死在代码当中会引发耦合效应
2:通过编码的方式为成员边量进行赋值会出现耦合,注入的方式会避免这样的耦合的作用
3:如何注入?
<bean id = "person" class = "com.pactera.spring.Person"><!--property标签是复制标签,name属性是对应bean类中的属性。--><property name = "id"><value>10</value></property><property name = "name"><value>xjr</value></property></bean>
这是注入的一种示例:为成员变量提供set和get方法,这是注入的第一步
4:注入好处
使用Spring的依赖注入的好处就是可以基于Spring的配置文件来做对象的成员变量赋值工作,这样不需要在Java代码中显示的给对象成员变量赋值,起到了解耦合的作用!
5:Spring注入的过程
Spring获取到配置文件路径之后,调用demo4j这个第三方组件来对xml配置文件进行解析,根据解析的内容创建对应的对象。对象创建之后,根据property标签中的配置的属性的值,根据对象的set和get方法进行赋值操作。
Spring会通过底层属性对应的set方法进行赋值才完成对应的赋值操作,这种方式我们也称为set注入

二:Set注入详解
针对于不同类型的成员变量,在标签中进行注入的方式也不一样,不过都得嵌套到property标签当中。
JDK内置类型:JDK自定义的数据类型或者叫引用类型。
用户自定义类型:用户自定义的类型
1:JDK内置类型
1、string+8中基本类型。<property name = "id"><value>10</value></property><property name = "name"><value>xjr</value></property>2、数组<property name="emails"><!--这个是为了定义数组--><list><value>suns@pactera.com</value><value>cuilei@pactera.com</value><value>kaixin@pactera.com</value></list></property>3、set集合<set><!--在这里能用value标签是因为在Set<String>属于八中基本类型和String的范畴。--><value>138111111111</value><!--ref这个标签是给自定义类的注入进行使用的。--><ref bean=""/><!--set集合当中还可以套用set集合--><set></set></set>4、list集合<property name="address"><list ><!--这是list集合的写法,list集合是有序的,list集合是可以重复的。--><value>zpark</value><value>shangdi</value><value>xierqi</value><set></set><ref></ref><list></list></list></property>5、map集合赋值方式<property name="qqs"><!--这里是map的写法。--><map><entry><key><value>suns</value></key><value>43222222222222</value></entry><entry><key><value>xiexei</value></key><value>43222222222222</value></entry>
<!-- <entry>当key或者value是对象的时候<key><value>zhang</value></key><ref bean="">43222222222222</ref><key><ref bean="">zhang</ref></key><ref bean="">43222222222222</ref></entry>--></map></property>
properties类型的赋值中更加复杂的JDK类型比如说:date类型需要使用自定义类型转换器进行,这是在工厂的高级部分进行讲解。
2:用户自定义类型
(一):第一种方式
1:第一步还是为成员变量提供get和set方法
2:第二步在配置文件中进行注入
补充说明:
1:通过这样一种编译时耦合与接口+配置文件中定义注入类型的这样的形式,最大程度上降低了代码的耦合型
2:这种写法代码冗余,而且会重复创建某个对象。写一个bean标签就会创建一个对象,而且注入的这个对象不可能被复用只能在这个对象中被引用,被注入的对象多次创建就会浪费虚拟机内存的资源
以下是代码示例:
/** @Description:给自定义引用类型赋值。* @Author: DaShu* @Date: 2021/5/28 16:02* result:说明配置文件当中这样写可以实现自定义类型的注入。*///<bean id="userService" class = "com.pactera.spring.UserServiceImpl">// <property name="userDao">// <!--这个dao对象只使用一次,并且不会被其他对象使用。-->// <bean class = "com.pactera.spring.UserDaoImpl"/>// </property>//</bean>//<bean id="userService" class = "com.pactera.spring.UserServiceImpl">// <property name="userDao">// <ref bean="userDao"/>// </property>//</bean>//<bean id="userDao" class="com.pactera.spring.UserDaoImpl"></bean>//<ref local = "">这个标签从spring4就已经废除了,这个只能引用本配置文件中的bean@Testpublic void test11() throws Exception {ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");UserService userService = (UserService)ctx.getBean("userService");Class clazz = userService.getClass();Field userDao = clazz.getDeclaredField("userDao");userDao.setAccessible(true);//Object o = userDao.get(userService);//System.out.println(o.getClass().getTypeName());//com.pactera.spring.UserDaoImplSystem.out.println(userDao.getGenericType());System.out.println(userDao.getName());System.out.println(userDao.get(userService).getClass().hashCode() == UserDaoImpl.class.hashCode());//true}
<bean id="userService" class = "com.pactera.spring.UserServiceImpl"><property name="userDao"><!--这个dao对象只使用一次,并且不会被其他对象使用。--><bean class = "com.pactera.spring.UserDaoImpl"/></property></bean>
(二):第二种方式

3:Set注入简化写法
(一):基于属性的简化
执行test方法的快捷键是 ctrl+shift+f10
这是jdk类型的注入的形式。
<property name = "name"><value = "suns">
</property>
该类型的简化写法
<property name = "name" value = "suns"/>
用value属性代替value标签。
注意:通过value属性只能简化八中基本类型和String类型。用户自定义类型:
<property name = "userDao"><ref bean = "userDao">
</property>
<property name= "userDao" ref = "userDao"/>
注意:这种方式只能替换ref属性的形式。
(二):基于p空间简化属性
适用于jdk的类型的简化:

alt+enter可以导入这个命名空间P的配置,在这个配置当中,有了这个命名空间之后,Property标签就没用了

三:构造注入
注入:通过Spring的配置文件,为成员变量赋值
Set注入:Spring通过Set方法,通过配置文件,为成员变量赋值
构造赋值:Spring通过构造方法,通过配置文件,为成员变量赋值
1:开发步骤
提供有参构造方法、提供spring的配置文件进行配置
<bean id = "customer" class="com.pactera.spring.constructor.Customer"><!--一个这样的标签对应一个这样的参数。并且顺序还是对应的。--><constructor-arg index="0"><value>suns</value></constructor-arg><constructor-arg index="1"><value>102</value></constructor-arg></bean>
/** @Description:用于测试构造工厂* @Author: DaShu* @Date: 2021/5/31 11:21*/@Testpublic void test13(){ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");Customer customer = (Customer) ctx.getBean("customer");System.out.println(customer.toString());//Customer{name='suns', age=102}}
2:构造方法的重载
参数的个数不同时通过constructor-arg标签的个数进行区分
参数相同时,通过在这个标签中引入type标签就可以解决
3:注入的总结
Set注入 vs 构造注入,未来这两种我们到底是使用什么注入
1:未来实战:使用set注入会更多,构造注入会更多,有重载,更麻烦,
2:Spring底层他自己的一些对象的配置,也是使用大量的set的注入,构造注入用的比较少。

四:反转控制和依赖注入
1:什么叫做控制反转
控制:控制值得是对于对象创建、程序变量赋值的控制权,控制和注入的关系不是并列的关系,控制翻转依赖注入的,注入是控制翻转中的一个环节,例如:直接在代码中完成对于成员边量的赋值,这提高了代码的耦合,这样的控制权是在代码中的,提高了耦合性,将成员变量的赋值权交给Spring工厂和他的配置文件,这样就通过注入的方式,控制权是在Spring上边,解开了耦合性。
控制反转也就是说:对于对象的创建、对象的成员变量的赋值的权利翻转到spring的工厂和配置文件当中,可以起到解耦合的作用,控制反转的好处解耦合的作用。
底层实现:工厂设计模式,反射+配置文件
代码编写中最好的降低耦合性的方式:
反射+配置文件+耦合月接口,可以把代码的耦合性降低早最低。

2:什么是依赖注入
通过Spring的工厂和配置文件为对象的成员变量赋值,依赖:我需要你的时候,你就是我的依赖:比如说:Service层中的Dao层的对象,就可以说Service层依赖dao层。Dao层是Service层的依赖。我依赖谁,就可以把他作为成员变量通过,spring的配置文件,创建他的对象,给我注入。好处:解耦合,通过提供set,get方法,最终通过Spring的配置文件完成对象的创建和注入
😉😉 学习交流群:
✅✅1:这是孙哥suns给大家的福利!
✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料
🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取!
🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞
💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞
相关文章:
详解原生Spring中的控制反转和依赖注入-构造注入和Set注入
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
数组中的第 K 个最大元素(C++实现)
数组中的第 K 个最大元素 题目思路代码 题目 数组中的第 K 个最大元素 思路 通过使用优先队列(最大堆)来找到数组中第k大的元素。通过弹出最大堆中的前k-1个元素,留下堆中的顶部元素作为结果返回。 代码 class Solution { public:int find…...
C++ day42背包理论基础01 + 滚动数组
背包问题的重中之重是01背包 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态,取或者不…...
数字人透明屏幕是如何工作的?
数字人透明屏幕是一种令人兴奋的科技产品,它结合了人脸识别、全息影像技术以及透明屏幕,为人们带来了全新的互动体验。本文将详细介绍数字人透明屏幕的工作原理以及其应用场景。 工作原理 数字人透明屏幕的工作原理主要包括人脸识别和全息影像技术。人脸…...
MIGO收货报替代“ZF002“, 步骤““ 中存在语法错误消息号 GB032错误
MIGO收货报替代"ZF002", 步骤"" 中存在语法错误消息号 GB032错误。替代"ZF002", 步骤"" 中存在语法错误消息号 GB032诊断 在 ABAP 代码生成过程中,在替代ZF002中发现了语法错误。 系统响应 未为该布尔陈述生成 ABAP 代码&…...
Vue3的transition标签以及animate.css使用详解
一:前言 在项目开发中,有一种特殊情况是使用动画过渡去完成某个效果。比如淡入淡出,或者在动画完成后执行某些操作等。在以前开发中我们通常会选择使用 CSS3 进行研发。但是这样会有很多不好的地方,比如最原始化的封装,…...
IDEA不支持Java8了怎么办?
IDEA不支持Java8了怎么办? 01 异常发生场景 当我准备创建一个springboot项目时,发现Java8没了 02 问题的产生及其原因 查阅了官方文档之后,确认了是Spring Boot 不再支持 Java 8,不是我的问题,这一天终于还是来了 0…...
flutter的TextField参数、案例整理(上)
TextField 概述 TextField 用于文本输入 构造函数 const TextField({Key key,this.controller, this.focusNode,this.decoration const InputDecoration(),TextInputType keyboardType,this.textInputAction,this.textCapitalization TextCapitalization.none,this.style…...
【Linux进阶之路】进程间通信
文章目录 一、原理二、方式1.管道1.1匿名管道1.1.1通信原理1.1.2接口使用 1.2命名管道 2.共享内存2.1原理2.2接口使用 3.消息队列原理 4.信号量引入原理 总结 一、原理 进程间的通信是什么?解释: 简单理解就是,不同进程之间进行数据的输入输出…...
深度学习框架配置
目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn,将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3.…...
全局配置
1.全局配置文件及其配置项 1.1.小程序窗口 1.2 窗口节点 1.2.1 导航栏标题 标题: 标题颜色: 背景色:只支持16进制值 下拉刷新: 刷新背景色: 刷新样式: 触底距离:...
leetcode算法之字符串
目录 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//法一:两两比较string ret strs[0];for(int i1;i<strs.size();i){ret f…...
mongodb查询数据库集合的基础命令
基础命令 启动mongo服务 mongod -f /usr/local/mongodb/mongod.conf //注意配置文件路径停止mongo服务 关闭mongodb有三种方式: 一种是进入mongo后通过mongo的函数关闭; use admin db.shutdownServer()一种是通过mongod关闭; mongod --s…...
基于FactoryBean、实例工厂、静态工厂创建Spring中的复杂对象
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
Android 如何让路由器或者其他AP设备获取到主机名
问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…...
java三大集合类--List
List Set Map 一、List 几个小问题: 1、接口可以被继承吗?(可以) 2、接口可以被多个类实现吗?(可以) 3、以下两种写法有什么区别? //List list1new List();是错误的因为List()…...
机器人向前冲
欢迎来到程序小院 机器人向前冲 玩法:一直走动的机器人,点击鼠标左键进行跳跃,跳过不同的匝道,掉下去即为游戏接续, 碰到匝道铁钉游戏结束,一直往前冲吧^^。开始游戏https://www.ormcc.com/play/gameStart…...
jq——实现弹幕滚动(往左滚动+往右滚动)——基础积累
最近同事在写弹幕功能,下面记录以下代码: 1.html代码 <div id"scrollContainer"></div>2.引入jq <script src"./script/jquery-1.8.3.js" type"text/javascript"></script>3.jq代码——往左滚…...
深度学习第2天:RNN循环神经网络
☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 文章目录 介绍 记忆功能对比展现 任务描述 导入库 处理数据 前馈神经网络 循环神经网络 编译与训练模型 模型预测 可能的问题 梯度消失 梯…...
深度学习之基于百度飞桨PaddleOCR图像字符检测识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介主要特点使用步骤 二、功能三、系统四. 总结 一项目简介 # Introduction to PaddleOCR Image Character Detection and Recognition System Based on Baidu…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
