在核心容器这一部分
bean
相关的操作,我们已经学完了,接下来我们就要进入到第二个大的模块,与我们的DI
,也就是依赖注入
相关知识的学习了,那我们先来学习第一个内容,依赖注入应该怎么去做,也就是依赖注入有哪些方式呢❓❓
我们要学习
两种
依赖注入的方式,我们先来思考这个问题:向一个类中传递数据的方式有几种?为什么要思考这个问题呢,因为我们前边说了,你的这个对象里边运行需要另外一个对象,你不能自己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。
对于
数组
的应该怎么写呢,记得一点,表示给它注入一个数组,因为它不是一个东西,是多个,里边写什么,如果写值的话,直接在里边写
接下来我们再来看看
list集合
的,我们在跟标签里边写的name属性
的值list是BookDaoImpl
里边的list对象
的名称,几乎跟数组一模一样。
现在我们来说
set集合
,它跟前两个也几乎一样,我们需要注意的是在set里边value的值
如果写重
的话,它会帮你自动过滤
。
下一个我们来说
map集合
,跟前边不一样的是,里边就不能写,因为map集合里边是
key:value
的形式,我们应该用
最后一个我们来说
properties集合
,也是跟上边有些不一样的,写value的地方应该改为。
value写在这
运行结果:
注意
:我们现在写的是简单类型
,如果要用引用类型
,只需要在value
后边加上❗❗❗
以上就是我们
依赖注入
的全部内容,最后,如果有什么错误的话,大家可以私信我,希望大家多多关注+点赞+收藏 ^_^,你们的鼓励是我不断前进的动力!!!