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

前言

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

依赖注入

setter注入

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

运行结果
在这里插入图片描述

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

构造器注入

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
注意:
在这里插入图片描述

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

自动装配

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述
匹配:
在这里插入图片描述
在这里插入图片描述

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

集合注入

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
运行结果:
在这里插入图片描述
注意:我们现在写的是简单类型,如果要用引用类型,只需要在value后边加上<ref bean="">❗❗❗

总结

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

  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 37
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

续写青春.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值