Spring 5 DI 相关内容 5.2 构造器 注入 5.2.5 构造器注入的一些问题
Spring
【黑马程序员2022新版SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术】
5 DI 相关内容
文章目录
- Spring
- 5 DI 相关内容
- 5.2 构造器 注入
- 5.2.5 构造器注入的一些问题
5.2 构造器 注入
5.2.5 构造器注入的一些问题
前几个小节已经完成了构造器注入的基本使用,但是有一些问题。
这个名字好像写死了。
- 当构造函数中方法的参数名发生变化后,配置文件中的name 属性也需要跟着变
- 这两个地方存在着很紧的耦合
【如何解决】?
提前说明的是,这个参数名发生变化的情况并不多,所以上面的还是比较主流的配置方式,下面介绍的都以了解为主。
【方式1:删除name 属性,添加type 属性,按照类型注入】
<?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.dingjiaxiong.dao.impl.BookDaoImpl"><constructor-arg type="java.lang.String" value="mysql"/><constructor-arg type="int" value="6666"/></bean><bean id="userDao" class="com.dingjiaxiong.dao.impl.UserDaoImpl"/><bean id="bookService" class="com.dingjiaxiong.service.impl.BookServiceImpl"><constructor-arg name="bookDao" ref="bookDao"/><constructor-arg name="userDao" ref="userDao"/></bean></beans>
- 这种方式可以解决构造函数形参名发生变化带来的耦合问题
- 但是如果构造方法参数中有类型相同的参数,这种方式就不太好实现了
【方式2:删除type 属性,添加index 属性,按照索引下标进行注入,下标从0开始】
<?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.dingjiaxiong.dao.impl.BookDaoImpl"><constructor-arg index="0" value="mysql"/><constructor-arg index="1" value="6666"/></bean><bean id="userDao" class="com.dingjiaxiong.dao.impl.UserDaoImpl"/><bean id="bookService" class="com.dingjiaxiong.service.impl.BookServiceImpl"><constructor-arg name="bookDao" ref="bookDao"/><constructor-arg name="userDao" ref="userDao"/></bean></beans>
- 这种方式可以解决参数类型重复问题
- 但是如果构造方法参数顺序发生变化后,这种方式又带来了耦合问题
【到底应该如何选择?】
强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
- 强制依赖指对象在创建的过程中必须要注入指定的参数
可选依赖使用setter注入进行,灵活性强
- 可选依赖指对象在创建过程中注入的参数可有可无
- Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
- 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
- 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
- 自己开发的模块推荐使用setter注入
【小结】
Spring的依赖注入的实现方式:
setter 注入
简单数据类型
<bean ...><property name="" value=""/> </bean>
引用数据类型
<bean ...><property name="" ref=""/> </bean>
构造器注入
简单数据类型
<bean ...><constructor-arg name="" index="" type="" value=""/> </bean>
引用数据类型
<bean ...><constructor-arg name="" index="" type="" ref=""/> </bean>
依赖注入的方式选择
- 建议使用setter注入
- 第三方技术根据情况选择
Spring 5 DI 相关内容 5.2 构造器 注入 5.2.5 构造器注入的一些问题相关推荐
- Spring 5 DI 相关内容 5.3 自动配置 5.3.4 完成自动装配的配置
Spring [黑马程序员2022新版SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术] 5 DI 相关内容 文章目录 S ...
- 设计模式相关内容介绍
1.设计模式相关内容介绍 1.1. 设计模式概述 创建型模式--------买建筑材料 用于描述------怎样创建对象,它的主要特点是----------将对象的创建与使用分离,这样可以降低系统的耦 ...
- JAVA面试汇总第四章 Spring及数据库相关
Spring 核心功能演示 + 面试题 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 Sprin ...
- DI 之Spring更多DI的知识
转载自 [第三章] DI 之 3.3 更多DI的知识 --跟我学spring3 3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始 ...
- 玩转Spring——Spring IOC/DI
什么是IOC ioc :Inversion of Control,即控制反转. 它不是一种技术,而是一种设计思想,即java程序中获取对象的方式发生反转,由最初的new方式创建,转变成由第三方框架创建 ...
- spring的DI,IOP,AOC,Spring的简单介绍
回顾: 1. mybatis的性能优化.一级缓存.减轻数据库的压力.默认开启.一级缓存是线程级别,sqlSession,缓存数据的map就放在sqlSession中的PerpetualCache的中. ...
- 对Spring loC DI的理解
文章转自https://www.cnblogs.com/Mr-Rocker/p/7721824.html,仅供个人学习所用,好东西当然要多多学习啊(#^.^#) 学习过Spring框架的人一定都会听过 ...
- android Wifi开发相关内容
今天,简单讲讲android里如何使用WifiManager. 之前,我看代码时,看到了wifi相关的代码,发现自己对于这个内容的使用还很不熟悉,所以在网上查找资料,最终解决了问题.这里记录一下. 移 ...
- spring的DI/IOC机制
先就IOC和DI谈一点我的看法. IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对 ...
最新文章
- Linq基础知识小记二
- 留不住客户?该从你的系统上找找原因了
- 前端iframe 能指定本地网页吗_微前端的技术拆分方式
- 数据库系统原理(第二章关系数据库 )
- 网不好怎么办?TLS握手带宽直降80%,BabaSSL是怎么做到的?| 龙蜥技术
- Vue工程模板文件 webpack打包
- java爬去淘宝数据链接重定向_scrapy爬取天猫被重定向302问题
- php调用at命令,执行AT命令在php中发送短信
- abaqus实例手册_ABAQUS_6.10例子问题手册(目录)
- java类声明语句_Java面向对象编程-类的声明周期
- PCI-E 5.0标准公布:速度再次翻番达32GT/s
- dategridview代码选中行_使用IntelliJ IDEA进行Java代码调试的技巧
- 人工神经网络图像识别,人脸识别神经网络模型
- matlab image反色,Matlab读入PNG图像后自动反色现象解释
- Java Excel 导出为 PDF
- 【JavaWeb】石家庄地铁搭乘系统——第二版
- vscode代码格式化时属性不换行
- 内网工具viper的介绍与配置简介
- 洛谷p1307数字反转 c语言
- 管中窥豹——应试教育与一流科学人才究竟有多远的差距
热门文章
- MicroZero教程 2.3 在Asp.core.net中使用ZeroNet
- 南方电网招聘计算机考题,2019年南方电网人才招聘笔试真题计算机类题库(156)...
- 阵列卡u盘安装系统步骤_如何为U盘装系统添加RAID卡的驱动
- python爬虫安装软件_为编写网络爬虫程序安装Python3.5
- ntpdate 安装_Win10下Microsoft MPI(MSMPI)的下载安装
- 交叉编译 FT4232 eeprom 开源工具 libftdi 记录
- canoe的dela_一种基于CANoe的ECU软件刷新方法及装置的制造方法
- 字符设备驱动之内核定时器防抖
- 在线谜语大全猜谜语 - 一刀工具
- 零跑汽车新能源汽车的领跑者