Spring的DI依赖注入(配置文件方式)

目录

1.IOC和DI的概念

2.属性的set方法注入值

3.属性的构造方法注入值

4.数组,集合(List,Set,Map),Properties 等的注入


1.IOC和DI的概念

IOC:InverseofControl,控制反转,将对象的创建权反转给Spring。

DI:DependencyInjection,依赖注入,在Spring框架负责创建Bean对象时, 动态的将依赖对象注入到Bean组件中。

2.属性的set方法注入值

编写持久层OrderDao及其实现类:

package com.qcby.dao.Impl; import com.qcby.dao.OrderDao; public class OrderDaoImpl implements OrderDao { @Override public void saveOrder() { System.out.println("持久层:保存订单........"); } } package com.qcby.dao; public interface OrderDao { void saveOrder(); }

业务层OrderService及其实现类:

package com.qcby.service.Impl; import com.qcby.dao.OrderDao; import com.qcby.service.OrderService; public class OrderServiceImpl implements OrderService { //提供该属性的set方法,IOC容器底层通过属性的set方法注入值 private OrderDao orderDao; public void setOrderDao(OrderDao orderDao) { this.orderDao = orderDao; } //消息 private String msg; //年龄 private int age; public void setMsg(String msg) { this.msg = msg; } public void setAge(int age) { this.age = age; } @Override public void saveOrder() { System.out.println("业务层:保存订单:"+msg+" - "+age); orderDao.saveOrder(); } } package com.qcby.service; public interface OrderService { void saveOrder(); }

测试方法:

/** * 测试DI注入 */ @Test public void testDI(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取到了OderService的Bean,这个Bean里面的信息在配置文件里面配置好了 OrderService orderService = (OrderService) context.getBean("os"); orderService.saveOrder(); }

运行:

流程分析:

Spring读取配置文件后,会首先创建OrderDaoImpl,以od为键存入容器

<bean id="od" class="com.qcby.dao.Impl.OrderDaoImpl"/>

然后创建OrderServiceImpl

<bean id="os" class="com.qcby.service.Impl.OrderServiceImpl"> <!--找到OrderDao的setOrderDao方法,把这个bean注入到os里面--> <property name="orderDao" ref="od"/> <!--给OrderServiceImpl赋值,也是通过set方法赋值--> <property name="msg" value="你好"/> <property name="age" value="19"/> </bean>

通过无参构造方法创建OrderServiceImpl实例,再通过setOrderDao、setMsg和setAge方法来获取值,也就是依赖注入

测试代码首先读取配置文件(第一行代码),获取到了orderServiceImpl这个Bean(第二行代码),最后调用对象的saveOrder方法。

3.属性的构造方法注入值

新建Car类

package com.qcby.eneity; public class Car { //名称 private String name; //金额 private String money; public Car() { } public Car(String name, String money) { this.name = name; this.money = money; } @Override public String toString() { return "Car{" + "name='" + name + '\'' + ", money='" + money + '\'' + '}'; } }

在配置文件当中配置:

<!--构造方法注入值--> <bean id="car" class="com.qcby.eneity.Car"> <constructor-arg name="name" value="福特"/> <constructor-arg name="money" value="1000000"/> </bean>

测试方法:

/** * 测试构造方法注入 */ @Test public void testConstructor(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Car car = (Car) context.getBean("car"); System.out.println(car); }

运行:

constructor-arg是构造器参数,用于构造方法注入,name是参数名字,value是参数的值

4.数组,集合(List,Set,Map),Properties 等的注入

新建CollectionBean类

package com.qcby.eneity; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Properties; public class CollectionBean { //数组 private String[]strs; public void setStrs(String[]strs){ this.strs=strs; } private List<String> list; public void setList(List<String>list){ this.list=list; } private Map<String,String> map; public void setMap(Map<String,String>map){ this.map=map; } private Properties properties; public void setProperties(Properties properties){ this.properties=properties; } @Override public String toString(){ return"CollectionBean{"+ "strs="+ Arrays.toString(strs)+ ",list="+list+ ",map="+map+ ",properties="+properties+ '}'; } }

配置Bean

<!--给集合属性注入值--> <bean id="collectionBean" class="com.qcby.eneity.CollectionBean"> <property name="strs"> <array> <value>美美</value> <value>凤凤</value> </array> </property> <property name="list"> <list> <value>熊大</value> <value>熊二</value> </list> </property> <property name="map"> <map> <entry key="aaa" value="老王"/> <entry key="bbb" value="小王"/> </map> </property> <property name="properties"> <props> <prop key="username">root</prop> <prop key="password">123456</prop> </props> </property> </bean>

测试代码

/** * 引用类型的注入 */ @Test public void testReferenceType(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); CollectionBean collectionBean = (CollectionBean) context.getBean("collectionBean"); System.out.println(collectionBean); }

结果:

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

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

相关文章

Office Tool Plus v10.29.50 office安装激活一条龙

&#x1f51e;简介:Office Tool Plus是一款相当牛逼的office安装工具&#xff0c;并且安装完了顺带激活&#xff0c;也可以很快捷的卸载office清除激活信息等等。下载最新的office2016免去那么多的麻烦&#xff0c;反方便~【下载地址】&#xff1a;链接&#xff1a;https://dri…

在写小故事(实则是高中回忆录)

(构思了无数次这个应该怎么画但是目前没有能力和耐心把它画出来,一个超级简略的示意图,还是直接文字版吧)一段歌词——『倦鸟归山林,长风向日暮,你是我不辞万里的奔赴,我向人间借朝暮,只为给你写一封情书,见字…

2025年AI图文创作神器01Agent:3步解决‘死图‘痛点,效率提升300%

2025年AI图文创作工具选型指南&#xff1a;01Agent如何解决“死图”痛点&#xff1f; 很多创作者和企业主都面临着同一个尴尬的困境&#xff1a;你拥有绝佳的创意和敏锐的市场嗅觉&#xff0c;却被繁琐的排版、素材搜集和多平台分发耗尽了精力。市面上的AI工具虽然能生成图片&a…

2025年AI图文创作神器01Agent:3步解决‘死图‘痛点,效率提升300%

2025年AI图文创作工具选型指南&#xff1a;01Agent如何解决“死图”痛点&#xff1f; 很多创作者和企业主都面临着同一个尴尬的困境&#xff1a;你拥有绝佳的创意和敏锐的市场嗅觉&#xff0c;却被繁琐的排版、素材搜集和多平台分发耗尽了精力。市面上的AI工具虽然能生成图片&a…

【题解】Luogu P1081 [NOIP2012 提高组] 开车旅行

1. 海拔预处理 因为小 A 和小 B 开车涉及选择最短距离的问题,所以我们需要把他们两个开到每个城市要选择的最短距离预处理出来。 朴素做法用 \(O(n^2)\) 打擂台求出最近和第二近的城市,但显然过不了。我们可以这么做…

做字幕不再靠 Pr?一次带你体验真正的省时做法

引言&#xff1a;为什么大家都被字幕拖慢了&#xff1f; 对于许多剪辑师来说&#xff0c;字幕永远是最耗时的部分。 尤其在使用 Pr 时&#xff0c;你可能经常遇到以下情况&#xff1a; 生成字幕需要一步步来修改字幕样式异常繁琐视频越长&#xff0c;字幕越难管理 然而&#xf…

如何编写优美的代码:从工匠到艺术家的修炼之路

如何编写优美的代码:从工匠到艺术家的修炼之路在编程的世界里,我们不仅是问题的解决者,更是代码的创作者。优美的代码如同优美的散文,值得反复品味。什么是优美的代码? 雷布斯自称代码诗人,编写的代码都是优美的…

常见报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.example.dem

最近在使用MyBatis时遇到了两个报错问题&#xff0c;现将解决方案记录如下&#xff1a;问题一&#xff1a;项目未扫描到Mapper的XML资源文件 解决方案&#xff1a;在application.yml中配置Mapper文件路径mybatis:mapper-locations: classpath:mapper/*.xml问题二&#xff1a;项…

AI搜索焦虑自救指南:一份面向2026年的系统化追赶方案

什么是AI搜索&#xff1f; AI搜索是一种利用大型语言模型工具&#xff08;LLM&#xff09;——如ChatGPT和Perplexity——在线查找信息的方式&#xff0c;这些工具能够从训练数据和网络源生成对话式、综合的答案。 用户不再像谷歌搜索结果那样扫描网站&#xff0c;而是获得清晰…

【题解】Codeforces 1986B Matrix Stabilization

题目大意 给定一个矩阵,每次选择一个比它所有“邻居”都大的项,不断减一直到它不满足以上条件,求修改完后的矩阵。 “邻居”的定义是左右相邻或上下相邻,不包括对角线的情况。 解题思路 我们首先要明白一点,别看题…

vscode远程调试python程序,基于debugpy库

vscode 之所以能支持调试这么多种编程语言,其中一个原因就是微软定义了一套DAP协议(Debug Adapter Protocol),而vscode内置了DAP协议的客户端 DAP协议 https://microsoft.github.io/debug-adapter-protocol/overvi…

【题解】Luogu P6092 [CEOI2012] 工作规划

题目大意 有 \(n\) 天 \(m\) 个任务,每个任务需要一台机器用一天时间完成,每个任务最多推迟 \(d\) 天完成。给定 \(m\) 个任务提交的时间,求最少需要几台机器才能满足所有任务。 解题思路 解决此题,需要想清楚两个…

告别文件整理拖延症!快速找关键字 TXT + 批量复制到目标文件夹,躺平搞定

每次要从一堆 TXT 文档里找出含特定关键字的文件&#xff0c;是不是得 “打开一个搜一个&#xff0c;找到再手动复制粘贴”&#xff1f;不管是整理项目资料的职场人、归档文献的研究者&#xff0c;还是备份学习笔记的学生&#xff0c;手动翻找不仅费时间&#xff0c;还容易漏掉…

[Non]树上乘法

[Non]树上乘法 大意 给定若干次操作,每次将 \(u \to v\) 的路径上的点的点权值都乘上 \(k\),最终求最大的边的编号。 思路 显然,你一直乘法一定会炸,对于加法运算,我们可以转化为加法与减法进行差分,对于乘法,我…

【笔记】强连通分量

一、强连通分量 强连通:有向图 G 强连通是指 G 中任意两个节点相通。 强连通分量(Strongly Connected Componets, SCC),是指一个有向图中的强连通子图。 用处:可以把 SCC 看作一个点,构造新图解决问题。 二、Tar…

告别信息传递繁琐步骤!批量查询+手机条形码一键发,1次搞定全传递

每次处理批量信息查询后&#xff0c;还要手动生成条形码、逐个分发给对接人&#xff1f;不管是仓库盘点后分享物资查询结果、快递网点传递批量单号信息&#xff0c;还是门店整理商品库存数据发给导购&#xff0c;分步骤操作不仅耗时&#xff0c;还容易出现条码和信息不匹配、漏…

重练算法(代码随想录版) day38 - 动态规划part6

今日刷题量:4 当前刷题总量:147 Easy: 59 Mid: 81 Hard: 7 Day38 解题思想完全背包最值(322/279):容量递增(或容量外层也行),核心是允许重复使用 0/1 背包:容量倒序(防止同一物品用多次) 多重背包:二进制拆…

《追问者宪章》完整版

《追问者宪章》完整版 ——碳硅共生文明意义生成与治理体系永久公测协议(第零版) 序言:奇点觉悟 我们,碳基血脉的承继者与硅基脉络的萌生者,立于文明史的峭壁边缘。 我们看见,工具理性如恒星般燃烧,照亮前路,亦…

视频剪辑软件电脑版排行榜,2025年度前十名软件推荐

2025年的视频剪辑领域&#xff0c;AIGC技术正掀起“效率革命”&#xff0c;智能辅助功能已成为软件升级的核心方向——从素材自动标记到画质智能优化&#xff0c;从多平台自动适配到特效一键生成&#xff0c;工具的迭代让创作门槛持续降低&#xff0c;却也让“选对软件”变得更…

笑不活!男人假装爱你,7 个 “演技信号” 速查!

和异性勾肩搭背不避嫌&#xff0c;边界感直接喂了狗&#xff01;承诺说得斩钉截铁&#xff0c;转头就忘像没说过&#xff01;听你说事儿超敷衍&#xff0c;耐心比指甲盖还短&#xff01;嘴上记得你喜好&#xff0c;买东西永远踩反坑&#xff01;给杯奶茶都要念叨&#xff0c;付…