Spring《三》DI 依赖注入

这篇具有很好参考价值的文章主要介绍了Spring《三》DI 依赖注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍎道阻且长,行则将至。🍓

上一篇:Spring《二》bean 的实例化与生命周期
下一篇:敬请期待

Spring《三》DI 依赖注入Spring《三》DI 依赖注入Spring《三》DI 依赖注入Spring《三》DI 依赖注入



向一个类中传递数据的方式有:普通方法(set 方法)构造方法。Spring 就相对应地为我们提供了两种注入方式:setter 注入构造器注入。同时也包括简单类型和引用类型(对象)注入。

* setter 方法 构造器
引用类型 类中添加 setter 方法,配置文件使用 property,ref = 引用对象 类中添加构造器方法,配置文件使用 constructor-arg,ref = 引用对象
基本类型 类中添加 setter 方法,配置文件使用 property,value = 值 类中添加构造器方法,配置文件使用 constructor-arg,value = 值

一、setter 注入🍉

在 Spring 入门篇中进行的 DI 依赖注入就是setter方法。

我们先创建好 Maven 项目,和上一篇类似,添加好项目依赖,添加 Spring 配置文件。在项目中添加 BookDao、BookDaoImpl、UserDao、UserDaoImpl、BookService 和 BookServiceImpl 类以及 AppForDISet 运行类。

public class AppForDISet {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("mySpringSetFile.xml");
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

1.注入引用数据类型

bookServiceImpl 对象中注入 bookDao userDao

  1. 在 BookServiceImpl 中声明属性并提供 setter 方法,同时在 save 方法中调用他们俩的 save
public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    private UserDao userDao;
    
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
        userDao.save();
    }
}
  1. 在配置文件中使用 property 进行注入配置
<bean id="bookService"class="Demo.Srevice.impl.BookServiceimpl">
    <property name="bookDao" ref="bookDao"/>
    <property name="userDao" ref="userDao"/>
</bean>
  1. 运行,注入成功
    Spring《三》DI 依赖注入

2.注入简单数据类型

BookDaoImpl 注入一些简单数据类型的数据。

  1. 声明属性并提供 setter 方法
private String databaseName;
private int connectionNum;
public void setDatabaseName(String databaseName) {
    this.databaseName = databaseName;
}
public void setConnectionNum(int connectionNum) {
    this.connectionNum = connectionNum;
}
  1. 在配置文件中使用 property 注入
<bean id="bookDao" class="Demo.Srevice.impl.BookServiceimpl">
    <property name="databaseName" value="mysql"/>
 	<property name="connectionNum" value="10"/>
</bean>
  1. 修改一下这个类的 save 方法:System.out.println("Book dao save ..."+databaseName+":"+connectionNum);
  2. 运行,注入成功:
    Spring《三》DI 依赖注入

二、构造器注入🍊

构造方法注入

可以继续使用前面的案例,将前面的注入删除或者注释掉。

1.注入引用数据类型

BookServiceImpl 类中的 bookDao userDao 修改成使用构造器的方式注入。使用快捷键 alt + insert 吧:
Spring《三》DI 依赖注入
Spring《三》DI 依赖注入

public BookServiceimpl(BookDao bookdao, UserDao userDao) {
    this.bookdao = bookdao;
    this.userDao = userDao;
}

在 Spring 配置文件里配置构造方式注入

    <bean id="bookService" class="Demo.Srevice.impl.BookServiceimpl">
<!--        <property name="bookdao" ref="bookDao"/>-->
<!--        <property name="userDao" ref="userDao"/>-->
        <constructor-arg name="bookdao" ref="bookDao"/>
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>

注入成功:
Spring《三》DI 依赖注入

注意这种方法在构造器和配置文件中的参数顺序不能乱,交换两个参数前后位置会提示警告:
Spring《三》DI 依赖注入

    <bean id="bookService" class="Demo.Srevice.impl.BookServiceimpl">
<!--        <property name="bookdao" ref="bookDao"/>-->
<!--        <property name="userDao" ref="userDao"/>-->
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookdao" ref="bookDao"/>
    </bean>

Spring《三》DI 依赖注入

Error creating bean with name ‘bookService’ defined in class path resource [mySpringSetFile.xml]: Unsatisfied dependency expressed through constructor parameter 0: Could not convert argument value of type [Demo.Dao.impl.UserDaoimpl] to required type [Demo.Dao.BookDao]: Failed to convert value of type ‘Demo.Dao.impl.UserDaoimpl’ to required type ‘Demo.Dao.BookDao’; nested exception is java.lang.IllegalStateException: Cannot convert value of type ‘Demo.Dao.impl.UserDaoimpl’ to required type ‘Demo.Dao.BookDao’: no matching editors or conversion strategy found

2.简单数据类型

修改 BookDaoImpl 类,添加构造方法:

public BookDaoImpl(String databaseName, int connectionNum) {
    this.databaseName = databaseName;
    this.connectionNum = connectionNum;
}

修改配置文件:

<bean id="bookDao" class="Demo.Dao.impl.BookDaoimpl">
	<constructor-arg name="databaseName" value="mysql"/>
	<constructor-arg name="connectionNum" value="666"/>
<!--        <property name="databaseName" value="mysql"/>-->
<!--        <property name="connectionNum" value="10"/>-->
</bean>

构造函数中方法的参数名发生变化后,配置文件中的 name 属性也需要跟着变,为了避免这种情况,可以选择 type 或者 index:
Spring《三》DI 依赖注入

根据数据类型:

<bean id="bookDao" class="Demo.Dao.impl.BookDaoimpl">
    <constructor-arg type="int" value="10"/>
    <constructor-arg type="java.lang.String" value="mysql"/>
<!--        <property name="databaseName" value="mysql"/>-->
<!--        <property name="connectionNum" value="10"/>-->
</bean>

根据参数位置:

<bean id="bookDao" class="Demo.Dao.impl.BookDaoimpl">
    <constructor-arg index="0" value="mysql"/>
    <constructor-arg index="1" value="10"/>
<!--        <property name="databaseName" value="mysql"/>-->
<!--        <property name="connectionNum" value="10"/>-->
</bean>

运行注入成功:
Spring《三》DI 依赖注入

同样的对于使用 name 的方法不能交换参数位置:
Spring《三》DI 依赖注入
Spring《三》DI 依赖注入
Spring《三》DI 依赖注入
错误的把配置文件中第一个参数给了构造器第一个参数。

三、自动配置🍇

前面的 Spring 注入方法仍然很麻烦,Spring 提供了自动配置方法。就是 IOC 容器根据 bean 所依赖的资源在容器中自动查找并注入到 bean 中。用于引用类型依赖注入,不能对简单类型进行操作

1.自动装配方式

1.按类型(常用)byType
2.按名称 byName
3.按构造方法 constructor
4.不启用自动装配 no
Spring《三》DI 依赖注入

2.自动装配的配置

再次把前面案例的注入删除。在 <bean> 中添加 autowire 属性。

2.1 按类型注入
<bean id="bookService" class="Demo.Srevice.impl.BookServiceimpl" autowire="byType"/>

1.需要注入属性的类中对应属性的 setter 方法不能省略。
2.被注入的对象必须要被 Spring 的 IOC 容器管理。
3.按照类型在 Spring 的 IOC 容器中如果找到多个对象,会报 NoUniqueBeanDefinitionException

2.2 按名称注入

如果一个类型在 IOC 中有多个对象,这个时候就需要按照名称注入(变量名与配置耦合,不推荐使用):

<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/>

按照名称去找对应的 bean 对象,找不到则注入 Null。
自动装配优先级低于 setter 注入与构造器注入,同时出现时自动装配配置失效。

3.集合类型注入

bean 中使用 property,根据集合类型:数组、List、Set、Map、Properties 设置 name 参数。
3.1 注入数组类型数据

<property name="array">
    <array>
        <value>100</value>
        <value>200</value>
        <value>300</value>
    </array>
</property>

3.2 注入 List 类型数据

<property name="list">
    <list>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>chuanzhihui</value>
    </list>
</property>

List 的底层也是通过数组实现的,所以 <list><array> 标签是可以混用。

3.3 注入 Set 类型数据

<property name="set">
    <set>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>boxuegu</value>
    </set>
</property>

3.4 注入 Map 类型数据

<property name="map">
    <map>
        <entry key="country" value="china"/>
        <entry key="province" value="henan"/>
        <entry key="city" value="kaifeng"/>
    </map>
</property>

3.5 注入 Properties 类型数据

<property name="properties">
    <props>
        <prop key="country">china</prop>
        <prop key="province">henan</prop>
        <prop key="city">kaifeng</prop>
    </props>
</property>

3.6 property 标签表示 setter 方式注入,构造方式注入 constructor-arg 标签内部也可以写 <array><list><set><map><props> 标签。
集合中要添加引用类型,只需要把 <value> 标签改成 <ref> 标签。


☕物有本末,事有终始,知所先后。🍭

Spring《三》DI 依赖注入

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓 文章来源地址https://www.toymoban.com/news/detail-420235.html

到了这里,关于Spring《三》DI 依赖注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring框架IOC容器和DI依赖注入

    IOC(Invertion Of Control):控制反转,使用对象时,由使用new创建对象转变为由外部提供对象,此过程中对象的创建控制权由程序转移到外部的思想称之为控制反转. DI(Dependency Injection):依赖注入,在容器中建立bean与bean之间的关系的过程,称之为依赖注入 pom.xml依赖引入 BookDao BookDaoImpl Book

    2023年04月09日
    浏览(89)
  • Spring的依赖注入(DI)是什么,有哪些实现方式?

    在Spring中,依赖注入的实现方式主要有以下几种: 类型式依赖注入(Type Based Dependency Injection):这种注入方式是通过Java接口或抽象类来实现的。具体来说,就是将需要注入的依赖关系定义为接口或抽象类,然后通过注解或XML配置文件等方式来指定具体的实现类。在运行时,

    2024年02月09日
    浏览(36)
  • Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

      掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用@Autowired注解开启自动装配模式(按类型) 说明:不管是使用配置文件还是配置类,都必须进行对应的Spring注解包扫描才可以使用。@Autowired默

    2024年02月14日
    浏览(58)
  • 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓

    在本文中,我们将介绍 IoC (控制反转)和 DI (依赖注入)的概念,以及如何在 Spring 框架中实现它们。 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传统编程相比,传统编程中我

    2024年02月04日
    浏览(58)
  • Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 控制:对于成员变量赋值的控制权 反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中。 好处:解耦合

    2024年02月05日
    浏览(42)
  • Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

    前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,以及详细讲解IOC,今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 思考:向一个类中传递数据的方式有几种?(给类

    2024年02月13日
    浏览(50)
  • 【Spring进阶系列丨第二篇】Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)

    我们都知道Spring 框架主要的优势是在 简化开发 和 框架整合 上,至于如何实现就是我们要学习Spring 框架的主要内容,今天我们就来一起学习Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)。 以经典的三层架构MVC作为案例,以前我们都是这么干的,看如下代码: 按照

    2024年02月05日
    浏览(70)
  • Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:Java Spring IoCDI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性 🎉欢迎大家点赞👍评论📝收藏⭐文章 我们一下要学习的内容都是为了实现⾼内聚低耦合来进行的 软件设计原则:⾼内聚低耦合. ⾼内聚指

    2024年04月15日
    浏览(48)
  • 【Spring教程十】Spring框架实战:全面深入详解IOC/DI之--纯注解开发模式下的依赖注入&&注解读取properties配置文件

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 全面深入详解IOC/DI注解开发》 Spring为了使用注解简化开发,并没有提供

    2024年02月04日
    浏览(57)
  • Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的 反射机制 。简单来说, 反射机制指的是程序在运行时能够获取自身

    2024年02月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包