news 2026/4/18 2:55:26

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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); }

结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 21:12:14

转行IT最吃香的六大岗位:从零到精通,就业无忧!

2025转行IT最吃香的六大岗位&#xff1a;从零到精通&#xff0c;就业无忧&#xff01; 随着数字化转型浪潮席卷全球&#xff0c;IT行业依然是职业转型者眼中的"黄金赛道"。2025年&#xff0c;哪些岗位最适合转行切入&#xff1f;本文将为你揭秘六大高潜力方向&#x…

作者头像 李华
网站建设 2026/4/16 0:30:05

字节跳动加码AI入口争夺战:豆包如何用“系统级智能”重构移动体验?

2025年末&#xff0c;字节跳动旗下的AI产品豆包正以一种前所未有的节奏加速布局。从深度集成于操作系统的手机助手&#xff0c;到与中兴合作推出的首款“豆包助手”工程机迅速售罄&#xff0c;再到以语音识别和大模型能力为核心、直指微信生态的豆包输入法&#xff0c;这一系列…

作者头像 李华
网站建设 2026/4/9 2:20:14

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

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

作者头像 李华
网站建设 2026/4/17 13:25:46

第九章 述职06 莹姐汇报演练

CBS升级专项&#xff0c;要给CFO做汇报。这个产品一直是莹姐在负责&#xff0c;对于专项汇报&#xff0c;原则上我都把机会给到对应的PM&#xff0c;主要考虑&#xff1a;我们产品线很多&#xff0c;如果都由我来汇报&#xff0c;那么占用我的精力过多&#xff0c;会耽误其他很…

作者头像 李华
网站建设 2026/4/16 9:11:17

Java8 JVM 调优案例:Major GC 和 Minor GC 频繁

针对Java 8中频繁发生Minor GC&#xff08;Young GC&#xff09;和Major GC&#xff08;Full GC&#xff09;的问题&#xff0c;这通常意味着内存分配速率过快、内存空间不足或者分代设置不合理。 JVM调优不是盲目调整参数&#xff0c;而是一个**“监控 -> 分析 -> 调优 …

作者头像 李华