【Spring(六)】彻底搞懂Spring的依赖注入

时间:2023-01-14 08:01:20

前言

   在核心容器这一部分bean相关的操作,我们已经学完了,接下来我们就要进入到第二个大的模块,与我们的DI,也就是依赖注入相关知识的学习了,那我们先来学习第一个内容,依赖注入应该怎么去做,也就是依赖注入有哪些方式呢❓❓

依赖注入

setter注入

   我们要学习两种依赖注入的方式,我们先来思考这个问题:向一个类中传递数据的方式有几种?为什么要思考这个问题呢,因为我们前边说了,你的这个对象里边运行需要另外一个对象,你不能自己new了,是不是需要外边传进来,那就是说这里边有几种方式可以传进来呢,说白了,就一种,就是用方法往里传,但问题来了,你拿方法传,方法可是有多种的,于是在这里边就分出来了两种????????。
  一种是普通方法,也就是咱们前边写的set方法,一种是构造方法,构造方法也是方法,它也可以用于传递数据,所以对于我们依赖注入的时候,除了用set方法传,其实也可以用构造方法传????????。

  我们再来思考第二个问题,我们前面运行service的时候要用dao,这个是ok的,但是如果现在运行某一个东西的时候它要的不是一个引用类型,是个基本数据类型,或者是个数字呢,比如我现在这个bean是个数据库连接池的bean,那我得知道要创建多少个连接对象,比如10个对象,这个10该如何告诉我呢,这是不是就有问题了,也就是说我们要想创造个bean,也有可能依赖的不仅是引用数据类型,有可能是基本数据类型或者字符串,那这个时候该怎么去做呢,所以说我们往里边注的数据应该也分两大类,第一类叫做引用类型,第二类我们把它划归一下叫简单类型包含基本数据类型string,根据上面的信息我们就得到了原来我们注入的时候要分四种情况????????

【Spring(六)】彻底搞懂Spring的依赖注入

  setter注入引用类型我们前几节已经学过, 这里就不再说了,我们先来学习setter注入简单类型????????。

  首先程序环境跟上篇文章的环境一样,我们在BookDao的实现类:BookDaoImpl中将原来的引用类型去掉,写两个简单类型的属性,一个是连接数量,一个是数据库名称,接下来应该怎么做呢,根据我们setter注入的规则,首先先提供入口的方法,并且在save()方法中打印这两个属性的值????????。

【Spring(六)】彻底搞懂Spring的依赖注入

  是不是到这里还不算完啊,我们在配置文件中也要做相应的配置,两个属性是在BookDaoImpl中,所以我们应该在BookDaoImpl的bean中配置相应的属性????????。里边写什么呢,因为还是注入属性,所以还是用的property,name就是属性名,下面是我们的值怎么告诉它,注意:ref是用来做引用bean的,要想给值,必须用value,然后把值写进去就行了????????。

【Spring(六)】彻底搞懂Spring的依赖注入

   注意:只要你用了value,类型你不用管,Spring内部就给你把类型转好了❗❗

运行结果
【Spring(六)】彻底搞懂Spring的依赖注入

   通过结果我们可以看出:setter注入简单类型成功了,在这里我们需要知道的是:配置属性的时候,因为你在BookDaoImpl中没有顺序这一说,所以在bean里边配置的时候也没有顺序这一说,所以说setter注入格式相对灵活,有关setter注入的基本格式,我们就已经说完了????????。

构造器注入

  setter注入说完了,接下来我们就来说第二种注入方式:构造器注入,也就是使用构造方法注入,程序环境也跟上边的环境一样,接下来我们来看使用构造方法是怎么做的????????。

  我们先对service做它的注入,因为现在是构造器注入,所以我们删除service实现类:BookServiceImpl中的 set()方法,删掉以后我们来生成它的构造方法,我们虽然换了方法,但是里边干的活一模一样,都是传递bookdao的对象的????????。

【Spring(六)】彻底搞懂Spring的依赖注入

  但是配置中就不一样了,原来我们写setter注入的东西就没了,怎么做构造器注入呢,用constructor-arg标签,标签里边的name属性,里边的值指是我们的构造方法形参的名称,可不是对象的名称,我们可以发现,构造器注入我们的代码耦合度比较高,我们形参的名称是可以变的,还有一个属性是ref属性,和以前一样,是参照哪个bean的意思????????。

【Spring(六)】彻底搞懂Spring的依赖注入
【Spring(六)】彻底搞懂Spring的依赖注入

  构造器注入引用类型我们说完了,我们接下来看看构造器注入简单类型????????。

【Spring(六)】彻底搞懂Spring的依赖注入

再来看看配置文件中应该如何配置????????

【Spring(六)】彻底搞懂Spring的依赖注入

  到这我们就学习完了构造器注入,说到这,我们有些东西需要注意一下,我们可以交换这两个☝️☝️配置的顺序吗❓❓

  当然是没有问题的,接下来我们就要说一个问题了,有人说,你这么写好是好,但是万一你的构造器中参数的名称变了????????,我们的配置肯定就不能用了,我们在name属性中也要进行修改,是不是就耦合了,那我们Spring不是这样的初衷呀,我们要解耦的,这种格式却把耦合度做的很高,那有没有解决方法呢,答案肯定是有的????????。

【Spring(六)】彻底搞懂Spring的依赖注入

  我们先来看第一种,我们要用形参,但是形参有可能改名,所以干脆在constructor-arg标签中干脆别写name属性了,不写名不就没有问题了,看上去好像没有问题,但是不写名,我们怎么知道该把哪个值给谁,针对这个问题,我们可以在标签中写type(类型),你把类型写了,就知道该给谁了????????。

【Spring(六)】彻底搞懂Spring的依赖注入

  我们虽然解决了形参名称的问题,但是遇到的类型相同该怎么办呢,针对这个问题,又出了全新的解决方案,我们直接在标签中用index属性将参数的位数告诉它 ????????。

【Spring(六)】彻底搞懂Spring的依赖注入
注意:
【Spring(六)】彻底搞懂Spring的依赖注入

  到这里我们就说完了构造器注入????????。

自动装配

  前边我们讲了两种依赖注入的方式,现在我们来学习Spring依赖注入中最强大的一个功能:自动装配,我们只学习一个东西,怎样做这个自动装配????????。

  那么什么是自动装配呢?就是IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。自动装配的方式有以下几种:

【Spring(六)】彻底搞懂Spring的依赖注入

  我们主要来学习按类型和按名称,代码环境也跟之前一样,我们首先来说service,要想自动装配,我们在里边还得提供set()方法????????

【Spring(六)】彻底搞懂Spring的依赖注入

  然后我们在配置这边,我们去掉自己原来配置的,然后在后边打上autowire,里边写啥呢,就写刚才我们几种自动装配的方式????????。

【Spring(六)】彻底搞懂Spring的依赖注入

注意:set()方法必须有,不然会报错
  在这里我们有实现了Dao接口的bean,如果把它注释了,那么就不知道该装配谁了,也会报错

  除此之外,我们将这个bean复制一份,那么现在在我们的程序中,满足dao接口的有几个bean,是不是有两个,这两个都满足,那么现在自动装配中按类型装配是装配谁❓❓,是不是选谁都不好使,于是这种情况也不能用,在程序中会显示报错????????。所以按类型匹配要求类型是唯一的❗❗

【Spring(六)】彻底搞懂Spring的依赖注入

  如果写了两个,那就要用我们的第二种方式:按名称装配,顾名思义,就是按名称匹配,什么名❓❓是BookServiceImpl中的 BookDao对象的名称和对应配置的bean的id属性相匹配,按名称匹配必须满足这个匹配要求????????。

【Spring(六)】彻底搞懂Spring的依赖注入
匹配:
【Spring(六)】彻底搞懂Spring的依赖注入
【Spring(六)】彻底搞懂Spring的依赖注入

  以上就是我们需要掌握的两种自动装配的方式????????。

集合注入

  我们前边讲的注入的东西基本都是单一的东西,接下来我们要学习的东西就是多个了,也就是集合怎么注入????????。

  我们只需要学习它的格式,首先先来看看程序环境,比之前简单,只有一个dao接口以及对应的实现类,还有对应的主方法,配置中也只配置了一个dao????????。

【Spring(六)】彻底搞懂Spring的依赖注入
【Spring(六)】彻底搞懂Spring的依赖注入
【Spring(六)】彻底搞懂Spring的依赖注入
【Spring(六)】彻底搞懂Spring的依赖注入
【Spring(六)】彻底搞懂Spring的依赖注入
【Spring(六)】彻底搞懂Spring的依赖注入

  对于数组的应该怎么写呢,记得一点<array></array>,表示给它注入一个数组,因为它不是一个东西,是多个,里边写什么,如果写值的话,直接在里边写<value></value>????????

【Spring(六)】彻底搞懂Spring的依赖注入

  接下来我们再来看看list集合的,我们在跟标签里边写的name属性的值list是BookDaoImpl里边的list对象的名称,几乎跟数组一模一样????????。

【Spring(六)】彻底搞懂Spring的依赖注入

  现在我们来说set集合,它跟前两个也几乎一样,我们需要注意的是在set里边value的值如果写重的话,它会帮你自动过滤????????。

【Spring(六)】彻底搞懂Spring的依赖注入

  下一个我们来说map集合,跟前边不一样的是,里边就不能写<value></value>,因为map集合里边是key:value的形式,我们应该用<entry key="" value=""/>????????

【Spring(六)】彻底搞懂Spring的依赖注入

  最后一个我们来说properties集合,也是跟上边有些不一样的,写value的地方应该改为<prop key="key写在这">value写在这</prop>????????。

【Spring(六)】彻底搞懂Spring的依赖注入
运行结果:
【Spring(六)】彻底搞懂Spring的依赖注入
注意:我们现在写的是简单类型,如果要用引用类型,只需要在value后边加上<ref bean="">❗❗❗

总结

  以上就是我们依赖注入的全部内容,最后,如果有什么错误的话,大家可以私信我????????,希望大家多多关注+点赞+收藏 ^_^????????,你们的鼓励是我不断前进的动力????????!!!