解释一下依赖注入:
依赖:bean对象的创建依赖于spring容器
注入:bean对象中的所有属性,也就是成员变量,由spring容器来注入
也就是说,spring管理对象,是全方位的管理,既包括了创建对象,又包括了将你创建的对象注入到其他创建的对象中使用(前提是要注入引用类型对象,至于基础类型的注入也是同样的道理,只不过是注入时用的属性名字不同而已,说白了就是ref与value的区别),就不必像以前的组合方式去引入其他类的对象了
构造器注入:
我们前面讲过IOC创建对象的方式,1中默认的无参构造器创建,3种有参构造器创建对象,要知道有参构造其实是对于无参构造的进一步简化,它简化就简化在用有参构造的时候,就可以在创建对象的同时将成员变量的初始值给赋值了,那么之前在讲IOC创建对象的方式的时候,既然你选择用了有参构造创建对象,那么你是不是得将有参构造中的成员变量给赋值啊,用的不就是constructor-arg这个标签吗?然后不就将你要创建对象的同时将成员变量赋值为你在这个标签中注入的值吗?这就是构造器注入
Set方式注入【最常用】:
我们创建一个address地址类
再创建一个student学生类:学生类中是不是成员变量可以给一个address类型的变量,可以给一个基本类型String类型的变量,这两个变量的注入赋值是不是之前讲过,引用类型就用ref,基本类型就用value就行,那么再给一个数组变量,再给一个list集合变量,map集合变量,set集合变量,properties类变量,空指针变量,然后给这些变量加上get、set方法,那么其实有了set方法,我们成员变量的赋值就可以通过set方式注入了。
就像刚才讲过的,之前用ref注入引用类型,用value注入基本类型,之前在hellospring里也讲过,对象的标签是bean标签:id代表这个bean的名字,class代表spring要new哪个类的对象,创建哪个类的对象是根据哪个类的全路径去判别,bean标签里面的子标签property:name代表要被注入的对象名称,而这个名称就对应的是传入set方法中的形参,其实里面this.name=name,不就是给对象的成员变量赋值了,value代表要注入的值
只不过下面讲的是对应不同的类型,同样是set方法注入,但是在spring容器中配置注入的标签及属性却有一些差异:
那么接下来我们就在spring的配置文件里去编写配置,将我们创建的类交由spring来托管,由我们spring容器来创建对象,并且对于我们的set注入,相对应我们的spring配置文件要如何写
注意:对于给null。我们就按下面的标签形式注入就行,对于给空,其实就是value=" "就行
测试一下:
结果:
拓展方式注入:
p命名空间注入:其实这个p就相当于property
c命名空间注入:其实就相当于我们构造器注入中的constructor
注意:命名空间注入需要在元数据配置中添加命名空间的配置