Spring框架之DI依赖注入

        Di(Dependence Injection)依赖注入,在spring框架负责创建bean对象时,动态地将依赖对象注入到其它对象中

一、什么是依赖注入。

我们在下面构建spring的过程中体会依赖注入; 

        从上面的图中我们知道,在ssm框架中服务层(server)无法直接操作数据库,持久层(dao)是直接操作数据库进行数据处理的,但是我们如果在服务层有一个持久层的对象,然后我们在服务层通过对象去调用持久层的方法就可以操作数据库了。

package com.exam.dao;public interface UserDao {void hello();
}
package com.exam.dao.Impl;import com.exam.dao.UserDao;public class UserDaoImpl implements UserDao {@Overridepublic void hello() {System.out.println("持久层,你好");}
}


UserServiceImpl类中的代码如下

package com.exam.service.impl;import com.exam.dao.UserDao;
import com.exam.service.UserService;public class UserServiceImpl implements UserService {private UserDao userDao;@Overridepublic void hello(){userDao.hello();}
}

这就是通过服务层去访问持久层的方法,我们在UserServiceImpl中定义了一个持久层(dao层)的对象UserDao,不过目前userDao对象还没有赋值,我们能想到的赋值方法应该只有使用new关键字。

private UserDao userDao = new UserDao()

 而Di依赖注入就是使用Spring配置文件来完成赋值这一步(可以把依赖注入就理解为给属性赋值),这样代码维护起来会更加方便

二、依赖注入的方式

1.属性的set方法注入值的方式

我们需要在server层类中写一个set方法,如下

在UserServerImpl类中添加set方法

    public void setUserDao(UserDao userDao) {this.userDao = userDao;}

现在我们对xml文件进行配置

    <bean id="us" class="com.exam.service.impl.UserServiceImpl"><property name="userDao" value=""/></bean>

如果是要对某个类的对象进行管理使用的是<bean>,如果要对某个类中的对象进行管理,我们使用的就是<property>,这个过程就叫做依赖注入(Di),底层也是通过反射实现的

<property name="userDao" ref=""/>
<property name="age" value=""/>

在这个标签中,name的值代表了对象的属性名,ref和value都是给属性赋值,那么这两个的区别是什么呢?

ref和value的区别

如果是简单类型(基本类型+字符串)property标签使用value

如果是自定义引用类型, property标签使用ref

那么我们该怎么给ref和value赋值呢?

        为了方便演示我们在UserServerImpl中添加了age属性和对应的set方法,下面是使用ref和value的应用情况。

    <bean id="us" class="com.exam.service.impl.UserServiceImpl"><property name="userDao" ref="ud"/><property name="age" value="18"/></bean><bean id="ud" class="com.exam.dao.Impl.UserDaoImpl"/>

我们分别在配置了依赖注入未配置依赖注入的情况下执行test代码

    @Testpublic void run2(){//创建spring ioc工厂,目的是加载spring配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//创建bean对象UserService userService = (UserService) ac.getBean("us");userService.hello();}

没配置的情况

报错了显示空指针 


配置了的情况

 

在依赖注入的情况下,我们想更改一个对象的值只需要更改配置文件就可以,不需要去找修改源代码,例如将年龄改成30,只需要更改,下面代码即可,维护起来更加方便。

        <property name="age" value="18"/>

2.构造方法注入值的方法

首先在UserServerImpl中添加构造方法,记得还得写无参构造方法,不然IOC  bean对象管理的时候会报错

    public UserServiceImpl(UserDao userDao, int age) {this.userDao = userDao;this.age = age;}
    <bean id="us" class="com.exam.service.impl.UserServiceImpl"><constructor-arg name="age" value="18"/><constructor-arg name="userDao" ref="ud"></constructor-arg></bean><bean id="ud" class="com.exam.dao.Impl.UserDaoImpl"/>

<constructor-arg>标签的name属性值,必须完全和构造方法中的形参对应,不能多不能少,比如构造方法中有name,那么<bean>标签中就不能只写

<constructor-arg name="userDao" ref="ud"></constructor-arg>

 那么我们怎么通过依赖注入去给数组这种集合类的数据赋值呢?

1.不可变数组赋值

例如在CollectionNean类中

public class CollectionNean {private String[] str;public void setStr(String[] str) {this.str = str;}
}

我们的配置文件就应该这么写

    <bean id="co" class="com.exam.service.impl.CollectionNean"><property name="str"><array><value>张三</value><value>小妹</value><value>小红</value></array></property></bean>
    @Testpublic void run2(){//创建spring ioc工厂,目的是加载spring配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//创建bean对象CollectionNean collectionNean = (CollectionNean) ac.getBean("co");System.out.println(collectionNean.toString());}

2.可变数组是怎么注入值的呢

这里指的是Java中的LIst<>类型

    private List<String> list;public void setList(List<String> list) {this.list = list;}
        <property name="list"><list><value>熊大</value><value>熊二</value></list></property>

 3.给map类型注入值

    private Map<String,String> map;public void setMap(Map<String, String> map) {this.map = map;}
        <property name="map"><map><entry key="name" value="张三"></entry><entry key="age" value="31"></entry><entry key="sex" value="男"></entry></map></property>

4.给properties类型注入值

    private Properties properties;public void setProperties(Properties properties) {this.properties = properties;}
        <property name="properties"><props><prop key="username">root</prop><prop key="password">123456</prop></props></property>

三、多配置文件的加载方式:

1.在主配置文件中使用import

    <import resource="applicationContext2.xml"/>
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

2.在创建工厂时直接加载多个配置文件

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext.xml2");

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

(三)C++之运算符重载

一.概念 C准许以运算符命名函数&#xff01;&#xff01;&#xff01; string a “hello”; a “ world”;// (a, “world”); cout<<“hello”; // <<(cout, “hello”); 可重载的运算符 不可重载的运算符 二.成员函数式(第一个行参是对象的引用) class T…

如何在AWS上构建Apache DolphinScheduler

引言 随着云计算技术的发展&#xff0c;Amazon Web Services (AWS) 作为一个开放的平台&#xff0c;一直在帮助开发者更好的在云上构建和使用开源软件&#xff0c;同时也与开源社区紧密合作&#xff0c;推动开源项目的发展。 本文主要探讨2024年值得关注的一些开源软件及其在…

前端vue3 实现pdf 生成的 类插件

前端 PDF 打印插件&#xff0c;基于 jspdf 和 html2canvas 开发 jspdfhtml2canvas 安装依赖 jspdf、html2canvas npm i jspdf html2canvas直接上代码 hooks

谷粒商城-全文检索-ElasticSearch

1.简介 一个分布式的开源搜索和分析引擎,可以 秒 级的从海量数据中检索 主要功能:做数据的检索和分析(MySQL专攻于数据的持久化存储与管理CRUD达到百万以上的数据MSQL就会很慢,海量数据的检索和分析还是要用ElasticSearch) 用途:我们电商项目里的所有的检索功能都是由Elasti…

【机器学习】--过采样原理及代码详解

过采样&#xff08;Oversampling&#xff09;是一个在多个领域都有应用的技术&#xff0c;其具体含义和应用方法会根据领域的不同而有所差异。以下是对过采样技术的详细解析&#xff0c;主要从机器学习和信号处理两个领域进行阐述。 一、机器学习中的过采样 在机器学习中&…

【BUG】已解决:note: This is an issue with the package mentioned above,not pip.

已解决&#xff1a;note: This is an issue with the package mentioned above&#xff0c;not pip. 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷…

园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现

随着现代园区规模的不断扩大与功能的日益复杂&#xff0c;传统的二维地图导航已难以满足访客高效、精准定位的需求。园区内部错综复杂的布局、频繁变更的商户位置常常让访客感到迷茫&#xff0c;造成寻路上的时间浪费。园区AR导航系统以创新的技术手段&#xff0c;破解了私域地…

签名优化:请求数据类型不是`application/json`,将只对随机数进行签名计算,例如文件上传接口。

文章目录 I 签名进行请求数据类型类型判断1.1 常见的ContentType1.2 签名切面处理1.3 文件上传案例1.4 处理接口信息背景: 文件上传接口的请求数据类型通常为multipart/form-data,方便携带文本域和使用接口文档进行调试。 如果携带JSON数据,不方便调试接口。 前端数据也要特…

网络安全-等级保护制度介绍

一、等保发展历程 &#xff08;1&#xff09;1994国务院147号令 第一次提出等级保护概念&#xff0c;要求对信息系统分等级进行保护 &#xff08;2&#xff09;1999年GB17859 国家强制标准发布&#xff0c;信息系统等级保护必须遵循的法规 &#xff08;3&#xff09;2005年公安…

JavaWeb笔记_Response对象

一.Response对象 1.1 Response对象概述 a.专门负责给浏览器响应信息&#xff08;响应行&#xff0c;响应头&#xff0c;响应体&#xff09;的对象 b.我们主要使用的是跟HTTP协议相关的Response对象&#xff1a;HTTPServletResponse&#xff0c;继承了ServletResponse&#x…

Spring Boot集成syslog快速入门Demo

1.什么syslog&#xff1f; Syslog-ng是由Balabit IT Security Ltd.维护的一套开源的Unix和类Unix系统的日志服务套件。它是一个灵活的、可伸缩的系统日志记录程序。对于服务器日志集中收集&#xff0c;使用它是一个不错的解决方案。syslog-ng (syslog-Next generation) 是sysl…

模型训练中出现loss为NaN怎么办?

文章目录 一、模型训练中出现loss为NaN原因1. 学习率过高2. 梯度消失或爆炸3. 数据不平衡或异常4. 模型不稳定5. 过拟合 二、 针对梯度消失或爆炸的解决方案1. 使用torch.autograd.detect_anomaly()2. 使用 torchviz 可视化计算图3. 检查梯度的数值范围4. 调整梯度剪裁 三、更具…

C++树(二)【直径,中心】

目录&#xff1a; 树的直径&#xff1a; 树的直径的性质&#xff1a; 性质1&#xff1a;直径的端点一定是叶子节点 性质2&#xff1a;任意点的最长链端点一定是直径端点。 性质3&#xff1a;如果一棵树有多条直径,那么它们必然相交&#xff0c;且有极长连…

自定义注解 + Redis 实现业务的幂等性

1.实现幂等性思路 实现幂等性有两种方式&#xff1a; ⭐ 1. 在数据库层面进行幂等性处理&#xff08;数据库添加唯一约束&#xff09;. 例如&#xff1a;新增用户幂等性处理&#xff0c;username 字段可以添加唯一约束. ⭐ 2. 在应用程序层面进行幂等性处理. 而在应用程序…

一款由AI编写,简洁而实用的开源IP信息查看器

大家好&#xff0c;今天给大家分享一款用于查询和显示用户当前 IP 地址的轻量级项目MyIP。 MyIP提供了多种功能&#xff0c;包括IP地址查询、网络连通性检查、WebRTC连接检测、DNS泄露检查、网速测试、MTR测试等等。 使用MyIP&#xff0c;我们可以轻松地查看自己的公网IP地址&…

Linux网络——套接字与UdpServer

目录 一、socket 编程接口 1.1 sockaddr 结构 1.2 socket 常见API 二、封装 InetAddr 三、网络字节序 四、封装通用 UdpServer 服务端 4.1 整体框架 4.2 类的初始化 4.2.1 socket 4.2.2 bind 4.2.3 创建流式套接字 4.2.4 填充结构体 4.3 服务器的运行 4.3.1 rec…

迁移学习在乳腺浸润性导管癌病理图像分类中的应用

1. 引言 乳腺癌主要有两种类型:原位癌:原位癌是非常早期的癌症&#xff0c;开始在乳管中扩散&#xff0c;但没有扩散到乳房组织的其他部分。这也称为导管原位癌(DCIS)。浸润性乳腺癌:浸润性乳腺癌已经扩散(侵入)到周围的乳腺组织。侵袭性癌症比原位癌更难治愈。将乳汁输送到乳…

2024717-VSCode-1.19.1-部署gcc13-C++23-win10-22h2

2024717-VSCode-1.19.1-部署gcc13-C++23-win10-22h2 一、软件环境 标签:C++ VSCode mingw gcc13分栏:C++操作系统:Windows10 x64 22h2二、操作步骤 1. 下载安装VScode 1.1官网 打开官网【https://code.visualstudio.com/Download】,选择【System Installer】【x64】,按…

Java面试八股之什么是Redis的缓存更新

什么是Redis的缓存更新 Redis的缓存更新是指当缓存中的数据发生变化时&#xff0c;需要将这些变化同步到缓存中以保持数据的一致性。缓存更新的目的是确保缓存中的数据始终是最新的&#xff0c;以便用户可以获取到最新的数据。 常见的缓存更新策略包括&#xff1a; 直接覆盖…

AWS基础知识

VPC (Virtual Private Cloud): 参考&#xff1a;https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html With Amazon Virtual Private Cloud (Amazon VPC), you can launch AWS resources in a logically isolated virtual network that you’ve defined…