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>

  • 这种方式可以解决参数类型重复问题
  • 但是如果构造方法参数顺序发生变化后,这种方式又带来了耦合问题

【到底应该如何选择?】

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现

    • 强制依赖指对象在创建的过程中必须要注入指定的参数
  2. 可选依赖使用setter注入进行,灵活性强

  • 可选依赖指对象在创建过程中注入的参数可有可无
  1. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  2. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  3. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
  4. 自己开发的模块推荐使用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 构造器注入的一些问题相关推荐

  1. Spring 5 DI 相关内容 5.3 自动配置 5.3.4 完成自动装配的配置

    Spring [黑马程序员2022新版SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术] 5 DI 相关内容 文章目录 S ...

  2. 设计模式相关内容介绍

    1.设计模式相关内容介绍 1.1. 设计模式概述 创建型模式--------买建筑材料 用于描述------怎样创建对象,它的主要特点是----------将对象的创建与使用分离,这样可以降低系统的耦 ...

  3. JAVA面试汇总第四章 Spring及数据库相关

    Spring 核心功能演示 + 面试题 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 Sprin ...

  4. DI 之Spring更多DI的知识

    转载自  [第三章] DI 之 3.3 更多DI的知识 --跟我学spring3 3.3.1  延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始 ...

  5. 玩转Spring——Spring IOC/DI

    什么是IOC ioc :Inversion of Control,即控制反转. 它不是一种技术,而是一种设计思想,即java程序中获取对象的方式发生反转,由最初的new方式创建,转变成由第三方框架创建 ...

  6. spring的DI,IOP,AOC,Spring的简单介绍

    回顾: 1. mybatis的性能优化.一级缓存.减轻数据库的压力.默认开启.一级缓存是线程级别,sqlSession,缓存数据的map就放在sqlSession中的PerpetualCache的中. ...

  7. 对Spring loC DI的理解

    文章转自https://www.cnblogs.com/Mr-Rocker/p/7721824.html,仅供个人学习所用,好东西当然要多多学习啊(#^.^#) 学习过Spring框架的人一定都会听过 ...

  8. android Wifi开发相关内容

    今天,简单讲讲android里如何使用WifiManager. 之前,我看代码时,看到了wifi相关的代码,发现自己对于这个内容的使用还很不熟悉,所以在网上查找资料,最终解决了问题.这里记录一下. 移 ...

  9. spring的DI/IOC机制

    先就IOC和DI谈一点我的看法. IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对 ...

最新文章

  1. Linq基础知识小记二
  2. 留不住客户?该从你的系统上找找原因了
  3. 前端iframe 能指定本地网页吗_微前端的技术拆分方式
  4. 数据库系统原理(第二章关系数据库 )
  5. 网不好怎么办?TLS握手带宽直降80%,BabaSSL是怎么做到的?| 龙蜥技术
  6. Vue工程模板文件 webpack打包
  7. java爬去淘宝数据链接重定向_scrapy爬取天猫被重定向302问题
  8. php调用at命令,执行AT命令在php中发送短信
  9. abaqus实例手册_ABAQUS_6.10例子问题手册(目录)
  10. java类声明语句_Java面向对象编程-类的声明周期
  11. PCI-E 5.0标准公布:速度再次翻番达32GT/s
  12. dategridview代码选中行_使用IntelliJ IDEA进行Java代码调试的技巧
  13. 人工神经网络图像识别,人脸识别神经网络模型
  14. matlab image反色,Matlab读入PNG图像后自动反色现象解释
  15. Java Excel 导出为 PDF
  16. 【JavaWeb】石家庄地铁搭乘系统——第二版
  17. vscode代码格式化时属性不换行
  18. 内网工具viper的介绍与配置简介
  19. 洛谷p1307数字反转 c语言
  20. 管中窥豹——应试教育与一流科学人才究竟有多远的差距

热门文章

  1. MicroZero教程 2.3 在Asp.core.net中使用ZeroNet
  2. 南方电网招聘计算机考题,2019年南方电网人才招聘笔试真题计算机类题库(156)...
  3. 阵列卡u盘安装系统步骤_如何为U盘装系统添加RAID卡的驱动
  4. python爬虫安装软件_为编写网络爬虫程序安装Python3.5
  5. ntpdate 安装_Win10下Microsoft MPI(MSMPI)的下载安装
  6. 交叉编译 FT4232 eeprom 开源工具 libftdi 记录
  7. canoe的dela_一种基于CANoe的ECU软件刷新方法及装置的制造方法
  8. 字符设备驱动之内核定时器防抖
  9. 在线谜语大全猜谜语 - 一刀工具
  10. 零跑汽车新能源汽车的领跑者