上一节提到的是让Spring帮我们创建Dao层的对象,但在我们的实际开发中也有web层业务层
我们先创建一个UserService的接口
在UserService接口中写入一个save方法,业务层的save调dao层的save
在demo目录下新建一个UserController充当web层,它的内部是要获得service
这个环境就搭好了。但是这个环境是由问题的,问题在哪儿里呢?
将UserDao给UserService,那么是怎么给的呢?
我们可以这样想,我们把某个对象或者某个数据给另一个对象,那我们得调用那个对象的某个方法才能给它。
那我们怎样才能把一个对象设置到这个对象的内部
两种方法:
1.我们可以用UserService.set UserDao有参构造方法
那么我们这个项目是谁需要谁的依赖注入,其实就是UserServ需要UserDao的依赖注入
下面我们先演示set方法,既然我么要把Dao注入到我们Service,那么在Service里面要有一个set方法。
我们不用自己从容器中获得dao,因为从容器内部从set方法注入了
因为UserDao被注入了,所以userDao是有值的是可以直接调用save方法的
我们要把userdao注入到service但是我么spring不知道,所以我们要在spring配置中告诉spring我们要在service中注入userdao
我们在bean标签里添加一个property标签 name代表但是属性名也就是set方法后面的成员变量但是首字母是小写的
我们对象的引用用ref引用的是userdao
这里我们要是不使用容器来调用save方法就会报空指针错误
也就是这部分的错误
我么new出来的UserService对象里面并没有UserDao所以会报空指针异常
下面我们开一下p命名空间也就是把bean标签的子标签给省略掉了
Bean依赖注入的第二种方法
构造方法方式:
现在我们要用构造方法方式依赖注入,所以我们要告诉Spring我们使用哪种方式使用的
、
如果是像以下那样什么都不写,那么默认是无参构造
而无参构造没有UserDao
这里的name是参数名
而ref是引用bean标签的id名
我们发现这个是可以成功输出的
是因为配置时,创建对象时,我们通过注入的方式构造方法去接收给
userDao一个值,让它可以去调用方法。
下面看一下普通数据类型和集合数据类型的注入方式
1.我们先来看普通数据类型的注入方式(两种注入方式:set和构造)
我们在save方法里面加一句输出,要是打印出结果,那么就是注入成功了
下一步就是告诉我们Spring该如何配置文件了
因为这是set方式注入所以我们要用property,又因为这是普通数据类型注入,所以不能用ref,而是用value。
下面讲一下Bean注入集合数据类型的注入方式
首先定义几个属性,并设置getter和setter方法
首先来配置一下spring文件,因为当时配置集合属性,所以property标签不能用value或者ref,
又因为这里配置的是list集合属性,所以我们可以用list标签,又因为strList集合是string类型是普通类型所以子标签用value
在UserDao下的save方法测试一次结果
控制台显示成功
下面测试一下map集合属性的注入方式
同样是property标签,因为是map集合类型,,所以在其子标签中放入map标签,map标签中放入一个entry子标签 它的属性有key代表键,value代表值,key-ref代表键是一个引入,value-ref
代表的是值的引入,ref代表的是要在bean容器中存在。
因为map集合的值是ref所以我们需要新建bean容器, 引用的对象就是User
因为对普通属性的引用,所以property的属性应该是value。
(key是map集合的键,叫啥都无所谓,value-ref代表的是对bean id的引用。)
我们对User进行toString重写方法,在控制台输出测试,可以看到userMap也有值了
最后来进行对property的引用(property本身键和值都是字符串)
对property的引用就是在其中放入子标签props和prop标签因为prop只有key属性,所以value就放在标签体中