Spring中的依赖注入(DI)的几种方法的使用

文章目录

  • Spring中的依赖注入(DI)的几种方法的使用
    • 1、构造函数注入
      • 业务层实现类
      • application.xml
    • 2、set方法注入
      • 业务层实现类
      • application.xml
    • 3、自动注入
      • 业务层实现类
      • application.xml
    • 4、注入集合类型的属性
      • 业务层实现类
      • application.xml
    • 测试类

Spring中的依赖注入(DI)的几种方法的使用

DI(Dependency Injection)依赖注入,在Spring创建对象的同时,为其属性赋值,称之为依赖注入。

1、构造函数注入

顾名思义,就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。具体代码如下:

业务层实现类

public class UserServiceImpl implements UserService {private UserDao userDao;private String name;private Integer age;public UserServiceImpl(UserDao userDao, String name, Integer age) {this.userDao = userDao;this.name = name;this.age = age;}public void addUser(){System.out.println(name+","+age);userDao.addUser();}
}

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"><!--要求:类中需要提供一个对应参数列表的构造函数。标签:constructor-arg==给谁赋值:==index:指定参数在构造函数参数列表的索引位置name:指定参数在构造函数中的名称==赋什么值:==value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean--><constructor-arg name="userDao" ref="userDao"></constructor-arg><constructor-arg name="name" value="张三"></constructor-arg><constructor-arg name="age" value="18"></constructor-arg></bean>
</beans>

2、set方法注入

顾名思义,就是在类中提供需要注入成员的set方法。具体代码如下:

业务层实现类

public class UserServiceImpl implements UserService {private UserDao userDao;private String name;private Integer age;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void addUser(){System.out.println(name+","+age);userDao.addUser();}
}

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"><!--要求:property标签:constructor-arg==给谁赋值:==name:找的是类中set方法后面的部分==赋什么值:==value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean--><property name="userDao" ref="userDao"></property><property name="name" value="张三"></property><property name="age" value="18"></property></bean>
</beans>

3、自动注入

不用在配置中 指定为哪个属性赋值,由spring自动根据某个 “原则” ,在工厂中查找一个bean并为属性注入值。具体代码如下:

业务层实现类

public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void addUser(){userDao.addUser();}
}

application.xml

使用autowire="byType"或autowire=“byName”

<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><!--autowire="byType":按照类型自动注入值--><bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType"></bean>
</beans>

或:

<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><!--autowire="byType":按照类型自动注入值--><bean id="userService" class="com.by.service.UserServiceImpl" autowire="byName"></bean>
</beans>

区别:
autowire=“byType”:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。

autowire=“byName”:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置

4、注入集合类型的属性

顾名思义,就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合。我们这里介绍注入数组,List,Set,Map。具体代码如下:

业务层实现类

public class UserServiceImpl implements UserService {private UserDao userDao;private String[] myStrs;private List<String> myList;private Set<String> mySet;private Map<String,String> myMap;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setMyStrs(String[] myStrs) {this.myStrs = myStrs;}public void setMyList(List<String> myList) {this.myList = myList;}public void setMySet(Set<String> mySet) {this.mySet = mySet;}public void setMyMap(Map<String, String> myMap) {this.myMap = myMap;}public void addUser(){System.out.println(Arrays.toString(myStrs));System.out.println(myList);System.out.println(mySet);System.out.println(myMap);userDao.addUser();}
}

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--1、注意:要导入schema约束-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"><!--要求:property标签:constructor-arg==给谁赋值:==name:找的是类中set方法后面的部分==赋什么值:==value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean--><property name="userDao" ref="userDao"></property><!-- 给mySet集合注入数据 --><property name="mySet"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></property><!-- 注入array数组数据 --><property name="myArray"><array><value>AAA</value><value>BBB</value><value>CCC</value></array></property><!-- 注入list集合数据 --><property name="myList"><list><value>AAA</value><value>BBB</value><value>CCC</value></list></property><!-- 注入Map数据 --><property name="myMap"><map><entry key="testA" value="aaa"></entry><entry key="testB" value="bbb"></entry></map></property></bean>
</beans>

测试类

public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = ac.getBean("userService", UserService.class);userService.addUser();}

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

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

相关文章

ARM CCA机密计算架构软件栈之Realm资源管理

领域资源管理的基本原则是主机保持控制。这意味着主机决定使用哪个物理内存来支持给定的领域中间物理地址&#xff08;IPA&#xff09;&#xff0c;或者存储RMM使用的Realm元数据的给定片段。 主机始终可以重新获取此物理内存&#xff0c;而无需得到领域的同意。同样&#xff…

JavaScript基本使用方法

JavaScript 是一种用于在网页上添加交互性和动态功能的脚本语言。下面是 JavaScript 的基本使用方法&#xff1a; 1.内嵌方式&#xff1a; • 在 HTML 文件中使用 <script> 标签来嵌入 JavaScript 代码。 • 可以在 <script> 标签内部编写 JavaScript 代码&#…

Leetcode算法系列| 11. 盛最多水的容器

目录 1.题目2.题解C# 解法一&#xff1a;暴力C# 解法二&#xff1a;双指针&#xff08;左指针大于右指针&#xff0c;left&#xff09;C# 解法三&#xff1a;双指针优化&#xff08;左指针小于等于最小高度&#xff0c;left&#xff09;Java 解法一&#xff1a;双指针Python3 解…

经常使用耳机对耳朵听力有影响吗?戴哪种耳机不伤耳朵听力?

经常使用耳机容易引起末梢感受器官受损&#xff0c;可能造成内耳功能损伤&#xff0c;出现耳聋、耳鸣等听力的适应性下降的症状&#xff0c;建议使用耳机时间不要过长&#xff0c;并且音量不要过大。如果想保护听力的话&#xff0c;建议选择骨传导耳机&#xff0c;骨传导耳机通…

【Delphi 基础知识 12】覆盖函数的使用

在Delphi中&#xff0c;使用关键字override可以覆盖&#xff08;override&#xff09;父类中的虚方法。以下是一个简单的覆盖函数的例子&#xff1a; unit OverrideExample;interfaceusesSysUtils;type// 父类TShape classprocedure Draw; virtual;end;// 子类TCircle class…

单片机快速入门

参考连接&#xff1a; 安装MinGW-64&#xff08;在win10上搭建C/C开发环境&#xff09;https://zhuanlan.zhihu.com/p/85429160MinGW-64; 链接&#xff1a;https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwdy1mz 提取码&#xff1a;y1mz --来自百度网盘超级会员V7的分享C…

rotate-captcha-crack项目重新训练百度旋转验证码角度预测模型

参考&#xff1a; building-powerful-image-classification-models-using-very-little-data.html https://github.com/Starry-OvO/rotate-captcha-crack &#xff08;主&#xff09;作者思路&#xff1a;https://www.52pojie.cn/thread-1754224-1-1.html 纠正 新版百度、百家…

低成本总线技术——LIN总线协议规范介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 本篇文章主要介绍LIN总线协议规范。 数据帧的结构 LIN的数据帧包括报头&#xff0c;响应两大部分。而报头…

Visual Studio 2013 “即将退休”

新年快乐&#xff01; 这也是向各位开发者提醒 Visual Studio 支持生命周期中即将到来的好时机。 对 Visual Studio 2013 的支持即将在今年(2024年)的4月9日结束。如果你正在使用旧版本的 Visual Studio&#xff0c;我们强烈建议您升级您的开发环境到最新的 Visual Studio 20…

浏览器是如何渲染页面的

浏览器是个极其复杂的程序&#xff0c;这里只是挑几个和前端息息相关的重要内容来说 在学习如何渲染之前需要知道一个浏览器浏览器会有多个进程&#xff0c;其中主要进程有浏览器进程&#xff0c;网络进程&#xff0c;渲染进程这里我们主要学习内容就发生在渲染进程。当渲染进程…

实现鼠标悬停显示书名、作者和价格的悬浮提示框功能

在开发在线书店网站的过程中&#xff0c;提供一个直观且用户友好的界面对于吸引和留住客户至关重要。其中一个能有效提升用户体验的功能是在用户将鼠标悬停在书封面上时&#xff0c;显示包含书名、作者和价格的悬浮提示框。这不仅为用户提供了即时信息&#xff0c;还增加了界面…

闭包(js的问题)

闭包的概念Closure&#xff1a;作用域 引用了自由变量的函数&#xff0c;这个被引用的自由变量将和这个函数一同存在&#xff1b; 即使已经离开了创造它的环境也不例外。 所以&#xff0c;闭包是由函数和其他相关的引用环境组合而成&#xff0c;实现信息驻留&#xff1b; 信…

如何在powershell查看.jar文件的java编译版本

整体过程 总的流程如下&#xff1a; 1. 获取.jar文件的绝对地址&#xff0c;即$JarPath $JarPath 2. 选择.jar文件任意一个类&#xff0c;即$ClassName $ClassName 3. 使用以下命令找到major字段跟着数字&#xff0c;即 javap -verbose -cp $JarPath $ClassName | S…

【解决openGauss无法使用gs_check等服务器端命令问题】

【解决openGauss无法使用gs_check等服务器端命令问题】 一、问题描述二、问题原因三、解决方法 一、问题描述 [ommopengauss03 ~]$ gs_check -i CheckCPU Parsing the check items config file successfully [GAUSS-53026]: ERROR: Execute SSH command on host 192.168.56.19…

给出一句话来描述想要的图片,就能从图库中搜出来符合要求的

介绍 地址&#xff1a;https://github.com/mazzzystar/Queryable The open-source code of Queryable, an iOS app, leverages the OpenAIs CLIP model to conduct offline searches in the Photos album. Unlike the category-based search model built into the iOS Photos…

项目使用PowerJob

新一代的定时任务框架——PowerJob 简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#xff0c;与xxl-job一样&#xff0c;基于web页面实现任务调度配置与记录&#xff0c;使用简单&#xff0c;上手快速&#xff0c;其主要功能特性如下&#xff1a; 使用简单&…

如何在 Windows 上从电脑硬盘恢复照片

如今&#xff0c;随着相机设备的普及&#xff0c;您可以轻松地一次拍摄一堆照片&#xff0c;将它们传输到硬盘上&#xff0c;然后再拍摄更多照片。但是&#xff0c;如果您的所有照片意外丢失在驱动器中怎么办&#xff1f;你能恢复它们吗&#xff1f; 在本指南中&#xff0c;我…

答案解析——C语言—第3次作业—算术操作符与关系操作符

本次作业链接如下&#xff1a; C语言—第3次作业—算术操作符与关系操作符 1.在C语言中&#xff0c;表达式 7 / 2 的结果是多少&#xff1f; - A) 3.5 - B) 3 - C) 4 - D) 编译错误 答案&#xff1a;B) 3 解析&#xff1a; 在C语言中&#xff0c;当两个整数进行除法运算时&…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…

postgresql可视化导入csv文件

不需要在命令行copy了&#xff0c;只需简单点几下 1.在数据库下建一个schema 右击选中数据库-new schema 2.双击你创建的schema&#xff0c;出现tables 3.右击tables&#xff0c;选择import wizard 4.选择你想导入的文件格式&#xff0c;之后一直next 5.选择你的文件所在位置…