【Spring】依赖注入方式,DI的方式

在这里插入图片描述

这里写目录标题

  • 1. setter注入
    • 在一个类中注入引用类型
    • 在一个类中注入简单类型
  • 2. 构造器注入
    • 在一个类中注入引用类型
    • 在一个类中注入简单类型
  • 3. 依赖注入方式选择
  • 4. 依赖自动装配
    • 按类型注入
    • 按名称注入
  • 5. 集合注入

1. setter注入

在一个类中注入引用类型

回顾一下之前setter注入的方法,我们有以下类:
BookDao.java

package com.example.demo.dao;public interface BookDao {void save();
}

BookDaoImpl.java

package com.example.demo.dao.impl;import com.example.demo.dao.BookDao;public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println("book dao save...");}
}

BookService.java

package com.example.demo.service;public interface BookService {void save();
}

BookServiceImpl.java

package com.example.demo.service.impl;import com.example.demo.dao.BookDao;
import com.example.demo.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao;@Overridepublic void save() {System.out.println("book service save...");}
}

我们想要将BookDaoImpl注入到BookServiceImpl中,最简单的方法就是通过setter注入
第一步:BookServiceImpl中建立bookDaosetter方法:

package com.example.demo.service.impl;import com.example.demo.dao.BookDao;
import com.example.demo.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao;@Overridepublic void save() {System.out.println("book service save...");}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}
}

第二步: 配置bookDao,和bookService两个bean(在resource下建立Spring Config文件):

<?xml version="1.0" encoding="UTF-8"?>
<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"><bean id="bookDao" class="com.example.demo.dao.impl.BookDaoImpl"/><bean id="bookService" class="com.example.demo.service.impl.BookServiceImpl"><property name="bookDao" ref="bookDao" /></bean>
</beans>

id属性为bean的名称,class为对应需要注入的类
property表示类里面需要注入的属性,name是属性名称,ref是属性的引用类,这里引用的是上面的bookDao


以上两步即可完成配置,测试一下:

package com.example.demo.service.impl;import com.example.demo.dao.BookDao;
import com.example.demo.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao;@Overridepublic void save() {System.out.println("book service save...");bookDao.save();}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}
}

结果是:

book service save...
book dao save...

在一个类中注入简单类型

假如在上面的BookDaoImpl.java中,还有两个简单类型:

package com.example.demo.dao.impl;import com.example.demo.dao.BookDao;public class BookDaoImpl implements BookDao {private int connectNum;private String databaseName;@Overridepublic void save() {System.out.println("book dao save...");System.out.println("connectNum:" + connectNum + ", databaseName:" + databaseName);}
}

第一步: 如果使用setter注入,首先给这两个简单类型写set方法:

public void setConnectNum(int connectNum) {this.connectNum = connectNum;
}public void setDatabaseName(String databaseName) {this.databaseName = databaseName;
}

第二步: 配置的时候,bookDao的配置应该这样写:

<bean id="bookDao" class="com.example.demo.dao.impl.BookDaoImpl"><property name="connectNum" value="10"/><property name="databaseName" value="name" />
</bean>

name表示属性的名字,value表示赋予简单类型的值
再执行一下上面写的测试主方法(此处略),结果为:

book service save...
book dao save...
connectNum:10, databaseName:name

总结简单类型的注入:
在这里插入图片描述

2. 构造器注入

在一个类中注入引用类型

BookDao.java

package com.example.demo.dao;public interface BookDao {void save();
}

BookDaoImpl.java

package com.example.demo.dao.impl;import com.example.demo.dao.BookDao;public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println("book dao save...");}
}

BookService.java

package com.example.demo.service;public interface BookService {void save();
}

BookServiceImpl.java

package com.example.demo.service.impl;import com.example.demo.dao.BookDao;
import com.example.demo.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao;@Overridepublic void save() {System.out.println("book service save...");}
}

我们想使用构造器注入在bookServiceImpl中注入bookDao,方法如下:
第一步: 在bookServiceImpl中写构造方法

public BookServiceImpl(BookDao bookDao) {this.bookDao = bookDao;}

第二步: 在配置中配置有参构造方法,通过constructor-arg标签进行构造,也就是向bookDao类型中传入一个什么样的参数

<?xml version="1.0" encoding="UTF-8"?>
<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"><bean id="bookDao" class="com.example.demo.dao.impl.BookDaoImpl"/><bean id="bookService" class="com.example.demo.service.impl.BookServiceImpl"><constructor-arg name="bookDao" ref="bookDao"/></bean>
</beans>

再运行主方法,可以获得一样的结果:

book service save...
book dao save...

同样的,假如我们还有一个UserDaoImpl
UserDao.java:

package com.example.demo.dao;public interface UserDao {void save();
}

UserDaoImpl.java:

package com.example.demo.dao.impl;import com.example.demo.dao.UserDao;public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("user dao save...");}
}

我们在BookServiceImpl中还引入了这个类型:

package com.example.demo.service.impl;import com.example.demo.dao.BookDao;
import com.example.demo.dao.UserDao;
import com.example.demo.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao;private UserDao userDao;public BookServiceImpl(BookDao bookDao) {this.bookDao = bookDao;}@Overridepublic void save() {System.out.println("book service save...");bookDao.save();userDao.save();}
}

则需要重新写一下构造方法:

public BookServiceImpl(BookDao bookDao, UserDao userDao) {this.bookDao = bookDao;this.userDao = userDao;}

并多加一行对userDao的配置:

<?xml version="1.0" encoding="UTF-8"?>
<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"><bean id="bookDao" class="com.example.demo.dao.impl.BookDaoImpl"/><bean id="userDao" class="com.example.demo.dao.impl.UserDaoImpl"/><bean id="bookService" class="com.example.demo.service.impl.BookServiceImpl"><constructor-arg name="bookDao" ref="bookDao"/><constructor-arg name="userDao" ref="userDao"/></bean>
</beans>

再次运行测试函数,结果如下:

book service save...
book dao save...
user dao save...

在一个类中注入简单类型

BookDao代码如下:

package com.example.demo.dao.impl;import com.example.demo.dao.BookDao;public class BookDaoImpl implements BookDao {private int connectNum;private String databaseName;@Overridepublic void save() {System.out.println("book dao save...");}
}

想要给两个简单类型属性做配置,方法都是一样的:
第一步: 创建构造方法

package com.example.demo.dao.impl;import com.example.demo.dao.BookDao;public class BookDaoImpl implements BookDao {private int connectNum;private String databaseName;public BookDaoImpl(int connectNum, String databaseName) {this.connectNum = connectNum;this.databaseName = databaseName;}@Overridepublic void save() {System.out.println("book dao save...");System.out.println("connectNum:" + connectNum + ", databaseName:" + databaseName);}
}

第二步: 配置属性

<?xml version="1.0" encoding="UTF-8"?>
<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"><bean id="bookDao" class="com.example.demo.dao.impl.BookDaoImpl"><constructor-arg name="connectNum" value="10"/><constructor-arg name="databaseName" value="aaa"/></bean><bean id="userDao" class="com.example.demo.dao.impl.UserDaoImpl"/><bean id="bookService" class="com.example.demo.service.impl.BookServiceImpl"><constructor-arg name="bookDao" ref="bookDao"/><constructor-arg name="userDao" ref="userDao"/></bean>
</beans>

运行后结果为:

book service save...
book dao save...
connectNum:10, databaseName:aaa
user dao save...

除了通过name指定配置的参数,还有两种办法指定:
我们上面通过name指定的是标准写法
第一种是通过参数类型进行指定(是为了解耦,避免配置和name耦合)
第二种是通过参数位置进行指定(为了解决有同样类型的参数的问题)
在这里插入图片描述

3. 依赖注入方式选择

在这里插入图片描述
建议使用setter注入
第三方技术根据情况选择

4. 依赖自动装配

定义:
在这里插入图片描述
注意,想要让IoC容器实现自动装配,必须给这些属性配置setter方法!

按类型注入

这些属性的类型要能够在配置的bean中的类型对应的上:
在这里插入图片描述
假如配置了两个指向同一类型,id不同的bean,显而易见bookService那里已经报红了:
在这里插入图片描述
如果仍让执行报错会提示,找到了两个bean,不知道匹配哪一个:
在这里插入图片描述
所以bean的类型指向必须唯一!

按名称注入

这些属性的名称要能够在配置的bean中的id对应的上:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5. 集合注入

假设我们的BookDaoImpl.java中有以下的数据类型

package com.example.demo.dao.impl;import com.example.demo.dao.BookDao;import java.util.*;public class BookDaoImpl implements BookDao {private int[] array;private List<String> list;private Set<String> set;private Map<String, String> map;private Properties properties;@Overridepublic void save() {System.out.println("book dao save...");System.out.println("遍历数组:" + Arrays.toString(array));System.out.println("遍历List:" + list);System.out.println("遍历set:" + set);System.out.println("遍历Map:" + map);System.out.println("遍历properties:" + properties);}public void setProperties(Properties properties) {this.properties = properties;}public void setMap(Map<String, String> map) {this.map = map;}public void setSet(Set<String> set) {this.set = set;}public void setList(List<String> list) {this.list = list;}public void setArray(int[] array) {this.array = array;}
}

配置文件如下写:

<bean id="bookDao" class="com.example.demo.dao.impl.BookDaoImpl"><property name="array"><array><value>100</value><value>200</value><value>300</value></array></property><property name="list"><list><value>a</value><value>b</value><value>c</value></list></property><property name="set"><set><value>c</value><value>c</value><value>d</value></set></property><property name="map"><map><entry key="country" value="china" /><entry key="province" value="guangdong" /><entry key="city" value="shenzhen" /></map></property><property name="properties"><props><prop key="country">china</prop><prop key="province">henan</prop><prop key="city">kaifeng</prop></props></property></bean>

set是会自动过滤重复元素的,结果如下:

book service save...
book dao save...
遍历数组:[100, 200, 300]
遍历List:[a, b, c]
遍历set:[c, d]
遍历Map:{country=china, province=guangdong, city=shenzhen}
遍历properties:{country=china, province=henan, city=kaifeng}

如果数组里面是引用类型,写法就是:

<property name="array"><array><ref bean="beanId" /></array>
</property>

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

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

相关文章

一个开源的汽修rbac后台管理系统项目,基于若依框架,实现了activiti工作流,附源码

文章目录 前言&源码项目参考图&#xff1a; e店邦O2O平台项目总结一、springboot1.1、springboot自动配置原理1.2、springboot优缺点1.3、springboot注解 二、rbac2.1、概括2.2、三个元素的理解 三、数据字典3.1、概括与作用3.2、怎么设计3.3、若依中使用字典 四、工作流—…

基于PI+重复控制的并网逆变系统谐波抑制策略模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; PI重复控制简介&#xff1a; 重复控制这一新型控制理论最早于出现日本学术界&#xff0c;其目的是为了用于解决质子加速器跟踪精度的问题。Yamamoto Y 等人提出了重复控制数学基础的内模原理&#xff0c;在控…

Filter和ThreadLocal结合存储用户id信息

ThreadLocal并不是一个Thread&#xff0c;而是Thread的局部变量。当使用ThreadLocal维护变量时&#xff0c;ThreadLocal为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每一个线程都可以独立地改变自己的副本&#xff0c;而不会影响其它线程所对应的副本。ThreadLoc…

基于R语言平台Biomod2模型的物种分布建模与可视化分析

!](https://img-blog.csdnimg.cn/84e1cc8c7f9b4b6ab60903ffa17d82f0.jpeg#pic_center)

python+django+mysql个人博客项目部署(VMware部署)

目录 一、Vmware新建win7虚拟机 二、组件/软件安装 2.1 安装python3 2.2 更新pip 2.3 安装pycharm 2.4 安装django 2.5 win安装mysql 三、配置数据库 3.1 安装sqlite客户端 3.2 db.sqlite3导出为myblog.sql 3.3 Heidisql连接本地sql 四、部署项目 4.1 安装模块 4.2 尝试运行 …

Pytorch torch.normal()的用法

该函数原型如下&#xff1a; normal(mean, std, *, generatorNone, outNone) 该函数返回从单独的正态分布中提取的随机数的张量&#xff0c;该正态分布的均值是mean&#xff0c;标准差是std。 用法如下&#xff1a;我们从一个标准正态分布N&#xff5e;(0,1)&#xff0c;提取…

【Java】ArrayList和LinkedList使用不当,性能差距会如此之大!

文章目录 前言源码分析ArrayList基本属性初始化新增元素删除元素遍历元素 LinkedList实现类基本属性节点查询新增元素删除元素遍历元素 分析测试 前言 在面试的时候&#xff0c;经常会被问到几个问题&#xff1a; ArrayList和LinkedList的区别&#xff0c;相信大部分朋友都能回…

【Unity】单例模式及游戏声音管理类应用

【Unity】单例模式及游戏声音管理类应用 描述 在日常游戏项目开发中&#xff0c;单例模式是一种常用的设计模式&#xff0c;它允许在应用程序的生命周期中只创建一个对象实例&#xff0c;并提供对该实例的全局访问点。通过使用单例模式&#xff0c;可以提高代码的可维护性和可…

cesium雷达效果(脉冲圆)

cesium雷达效果(脉冲圆) 下面富有源码 实现思路 使用ellipse方法加载圆型,修改ellipse中‘material’方法重写glsl来实现当前效果 示例代码 index.html <!DOCTYPE html> <html lang="en"><head>

Redis(集合Set和有序集合SortedSet)

SET集合中的元素是不允许重复的&#xff0c;SET中的命令都是以S开头的。 使用SADD 在集合中添加元素&#xff0c;使用SMEMBERS查看元素。 当添加重复元素时&#xff0c;会返回0代表添加失败&#xff0c;查询还是就Redis一个元素。 使用SISMEMBER查询元素是否在集合中&#xff…

井盖位移监测,智能井盖智慧监测方式

在推动城市向智能化和高效化方向发展的过程中&#xff0c;科学技术发挥着至关重要的作用。智能井盖传感器作为科学技术进步的产物&#xff0c;正逐渐在城市管理过程之中崭露头角。这些看似不起眼的设备&#xff0c;虽然隐藏在井盖下方不被人们看到&#xff0c;但实实在在为人民…

Jquery 通过class名称属性,匹配元素

UI自动化过程中&#xff0c;常常需要判断某个元素是否满足条件&#xff0c;再走不通的脚本逻辑&#xff1b;、本文介绍如何通过jquery判断菜单是否展开&#xff0c;来决定是否执行菜单展开脚本&#xff1b;Jquery通过class名称属性&#xff0c;匹配元素 我们先分析&#xff0c;…

HTTP 到 HTTPS 再到 HSTS 的转变

近些年&#xff0c;随着域名劫持、信息泄漏等网络安全事件的频繁发生&#xff0c;网站安全也变得越来越重要&#xff0c;也促成了网络传输协议从 HTTP 到 HTTPS 再到 HSTS 的转变。 HTTP HTTP&#xff08;超文本传输协议&#xff09; 是一种用于分布式、协作式和超媒体信息系…

RabbitMQ 消息丢失解决 (高级发布确认、消息回退与重发、备份交换机)

目录 一、发布确认SpringBoot版本 确认机制图例&#xff1a; 代码实战&#xff1a; 代码架构图&#xff1a; 1.1交换机的发布确认 添加配置类 消息消费者 消息生产者发布消息后的回调接口 测试&#xff1a; 1.2回退消息并重发&#xff08;队列的发布确认&#xff09; …

编写程序,要求输入x的值,输出y的值。分别用(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch语句。

编写程序&#xff0c;要求输入x的值&#xff0c;输出y的值。分别用&#xff08;1&#xff09;不嵌套的if语句&#xff08;2&#xff09;嵌套的if语句&#xff08;3&#xff09;if-else语句&#xff08;4&#xff09;switch语句。 选择结构是编程语言中常用的一种控制结构&…

适用于 Windows 的 10 个最佳视频转换器:快速转换高清视频

您是否遇到过由于格式不兼容而无法在您的设备上播放视频或电影的情况&#xff1f;您想随意播放从您的相机、GoPro 导入的视频&#xff0c;还是以最合适的格式将它们上传到媒体网站&#xff1f;您的房间里是否有一堆 DVD 光盘&#xff0c;想将它们转换为数字格式以便于播放&…

清华学霸告诉你:如何自学人工智能?

清华大学作为中国顶尖的学府之一&#xff0c;培养了许多优秀的人才&#xff0c;其中不乏在人工智能领域有所成就的学霸。通过一位清华学霸的经验分享&#xff0c;揭示如何自学人工智能&#xff0c;帮助你在这场科技浪潮中勇往直前。 一、夯实基础知识 数学基础&#xff1a;学习…

2023年首届天府杯数学建模国际大赛问题A思路详解与参考代码:大地测量数据中异常现象的特征和识别

地球变形观测是固体潮汐曲线分析和地震前体研究的重要手段&#xff0c;也是地球观测技术的重要组成部分。基于各种精密科学仪器的变形观测点主要集中在洞穴、地下井等易的自然灾害&#xff08;雷暴、强降雨、降雪等&#xff09;&#xff0c;人工维护、人工爆破等外部条件&#…

详解如何使用Jenkins一键打包部署SpringBoot项目

目录 1、Jenkins简介 2、Jenkins的安装及配置 2.1、Docker环境下的安装​编辑 2.2、Jenkins的配置 3、打包部署SpringBoot应用 3.1、在Jenkins中创建执行任务 3.2、测试结果 1、Jenkins简介 任何简单操作的背后&#xff0c;都有一套相当复杂的机制。本文将以SpringBoot应…

春秋云境靶场CVE-2022-32991漏洞复现(sql手工注入)

文章目录 前言一、CVE-2022-32991靶场简述二、找注入点三、CVE-2022-32991漏洞复现1、判断注入点2、爆显位个数3、爆显位位置4 、爆数据库名5、爆数据库表名6、爆数据库列名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。…