IOC操作Bean管理
什么是Bean管理?
之前我们的初始案例中就已经完成了对于对象的创建,但是如果我们想给对象注入初始属性应该怎么做呢?
Bean管理的两种操作方式
XML和注解(本节主要讨论XML管理)
1.创建对象
注意第三点
如果在我们的测试里的属性里有一个有参构造会怎么样呢?
java里如果有了有参构造,没有声明无参构造,就默认无参构造不存在
此时执行测试
2.注入属性
传统的set注入属性方式
传统的有参数注入属性方式
两种方法都可以实现属性注入
其实在spring中实现注入也对应着两种,但是传统的需要在主函数里进行调用,如何用spring把它开始的属性注入呢?
Spring的set注入属性方式
在xml文件里进行创建对象并且注入属性
测试:
为了方便观测,在Book1类里面加上属性输出,看看是不是我们设置的初始值
成功
Spring的有参构造注入属性方式
创建一个有参构造的带属性的类
在xml文件里进行创建对象并且注入属性
但是我们上面知道,spring默认是无参构造,但是现在条件不满足了,应该怎么办?
使用constructor-arg标签就可以解决
constructor-arg还可以有index属性,就是索引值,如果是0就是有参构造第一个参数,1就是第二个.....................
测试
成功
3.p名称空间注入
之前我们注入属性需要多个property标签,在这个地方可以稍微简略一下
在配置文件中加入p名称空间
此时我们注入的属性就可以写在bean标签里的属性了
以之前的book1为例子
测试
成功
但是此时的代码可读性不高,所以一般不使用
4.注入空值(null)和特殊符号
字面量:给属性设置的初始值就是属性的字面量
设置空值:
以BOOK1为例
在property里再嵌套一个null标签即可
测试
设置特殊字符:
以book1为例,设置属性值为“<anhui>”,如何做?
(1)通过转义字符
(2)把带特殊内容字符写入CDATA
测试
5.注入属性——外部bean
以下是项目结构
现在我们需要在service这个类里调用userdaoimpl里的update方法如何做?
原始方法
使用注入外部bean方法
我们可以在xml文件里创建两个对象,并且把userdao对象作为一个service的属性注入到service之中(使用set方法),所以现在的service代码应该是
等会注入成功之后直接调用自己的pravite的userdao属性的update方法就可以了
再通过xml文件进行注入
但是此时property标签里的内容应该变化了
测试
成功
6.注入属性——内部bean
对这个例子进行构建
如何给这个员工类里的属性通过内部bean注入属性值?
也就是说,内部注入是指在property标签里再创建一个自己需要的bean标签,并且给这个bean标签对应的属性赋值
但是这种用法其实不多,因为代码可读性比较差
测试
toString方法是如果输出这个类,就输出return内的内容
成功
7.注入属性——级联赋值
其实在6中,我们已经完成了级联赋值,在emp需要dept的时候spring帮助我们创建,并且给dept的dname赋了一个值——anbaobu(这是在内部bean级联赋值)
外部bean如何级联赋值?
测试
成功
还有一种特殊的外部级联赋值方式
多加了一个dept,dname,这是指在外部引入了dept类之后,找到emp里的dept的dname属性并且赋值,那么怎么找到呢?
当然是使用get方法来找到,所以需要在emp里加入dept的get方法
但是我感觉这种方法不好用,还是外部的方法可读性高一点
8.注入属性——注入集合类型
注入数组,List,Map,Set类型属性
在xml文件里如何表示?
从上到下依次对应,其实结构大差不差
测试
在stu里写一个输出方法
成功
那么问题来了
(1)可不可以向集合中设置对象并且注入到属性中?
(2)如果一个集合是许多属性的公共部分,可不可以在xml文件里进行抽取到一起和注入到不同的属性当中呢?
注入list集合类型,但是值是对象
在xml文件中我们可以创建多个课程对象并且通过外部bean的方式注入到stu的课程对象集合属性中
注意:此时list标签内的格式需要使用ref
测试:
成功
把公共集合的注入部分提取出来
如何把xml文件里的公共部分设置到book的lists之中?
使用utils名称空间
引用utils
测试
成功