在IOC容器中配置bean的方法也有固定的格式,spring中规定在容器中添加的bean属性需要写在<bean></bean>中,并指明该bean的id和类路径,如下:
三、通过IOC容器获取Bean属性
=====================
我们现在大概了解到了如果进行ioc容器的实例化和获取,那么我们在获取到ioc容器之后一般是如何获取其中的bean属性的呢?在spring中获取bean常用的方法是getBean(),该方法中的参数不同,所表示的含义也不同。
在这里介绍两种在spring中常用的获取bean的方法,
1、通过bean属性的id进行获取
这种方法需要知道我们所要获取的bean在容器中定义的id,如在ioc容器中有如下bean的定义:
<bean?id="person01"class=“com.spring.beans.Person”></bean>
则通过bean的id获取这个bean属性的方法就是:
2、通过bean的类型来进行获取
这种方法是在getBean()中赋于类的class进行获取的,方法如下:
有小伙伴可能就问了,要是在ioc容器中定义多个同一个类的bean属性,那么使用该方法到底该获取哪一个呢?
哎,这就对了!
所以这一种方法只能在ioc中只有一个该类型的bean时进行获取,否则就会报以下错误:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.spring.beans.Person] is defined: expected single matching bean but found 4: person01,person03,person04,person05
也就是说,没有找到结果,原因是符合要求的bean有多个,不知道该用哪一个了!
那么要是还是想用这一种方法,那该怎么办呢?
接下来就是第三种方法了。
3、通过类和属性名获取参数
这种方法是上面两个方法的结合体,在getBean()中传入的参数是两个,分别是属性的id和bean属性的类型,如下:
以上就是从ioc容器中获取bean属性的常用方法,
接下来我来和大家聊一下在IOC容器中又该如何给bean中的属性进行赋值呢?
四、在IOC中给bean的属性赋值的多种方法
==========================
现在我们已经知道了如何在容器中添加需要的bean了,那么接下来就是如何对这些bean进行赋值的问题,针对bean中属性的类型不同,spring中有多种为bean中属性赋值的方法。接下来我们对这几种方法一一介绍。
1、通过无参构造并指定属性赋值
首先第一种方法,也是最普通常用的一种方法,就是利用bean中属性的set方法进行赋值,这种方法对属性的赋值语句需要写了<bean></bean>的<property></property>中,
其中的name中的参数是你在bean中定义的属性名,value是你将要赋予的属性值,
2、通过有参构造并指定属性进行赋值
上面那种方法指定在bean没有有参构造器的情况下进行属性的赋值的方法,那么现在这种方法就是,当bean中存在有参构造器时使用的赋值方法,当然,当bean中同时存在有参构造和无参构造器时,上面那种方法还可以使用!
通过有参构造器进行赋值使用的并不是<property></property>,而是在<constructor-arg></constructor-arg>中,其中的参数name和value与上面的含义一样。
3、通过有参构造不指定属性进行赋值
第二种方法介绍了使用有参构造指定属性进行赋值,但是有小伙伴们就该说了,那这不是和第一种方法使用差不多嘛,哎,那我们现在再来看一种方法。利用有参构造不指定属性进行赋值,也就是说不使用name了,直接使用value进行赋值。比如我们的bean中的有参构造器长这样:
那么通过有参构造不指定属性进行赋值时,就需要将赋值元素书写的顺序按照有参构造器中元素属性的顺序进行书写了
在这里有一点需要注意:
就是如果两个有参构造器属于重载,那么在ioc中进行赋值时就需要使用type在 value的后面指明赋值的元素的属性,比如是string还是int型的。
关于type的使用我们看下面的方法!
4、通过索引值指定参数的位置
当我们在使用有参构造器不指定属性赋值时,还有另外的方法,可以不必须的按照顺序来书写赋值。那就是使用索引和属性类型了,**使用索引进行赋值时需要使用到index参数,指定要赋值的属性的序号,**如对于上面person的构造函数,使用index指定元素位置进行赋值。name的index是0,age是1.
按照上面的方式同样可以得到相同的赋值效果
5、通过类型不同区分重载的构造器
如我们现在有两个同名的有参构造器,但是其中参数类型不一样,如果我们依然使用上面的两种方法来对bean中的属性进行赋值,那么明显是会报错提示构造器不唯一的。
所以这个时候就需要使用type指定参数的类型,同时index和type可以结合使用,如下:
6、利用P名称空间进行赋值
下面我们来介绍一个全新的赋值方式,利用P名称空间进行赋值。
为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息。Spring从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean的属性。
使用p命名空间后,基于XML的配置方式将进一步简化。具体使用如下,
首先我们应该在xml文件中加入P名称空间的使用插件。
加入P名称空间的使用插件的方法如下:以eclipse为例:
之后在xml的头文件的<beans>中看到如下代码就添加成功了,或者直接在<beans>头文件中加入以下代码:
xmlns:p=“ http://www.springframework.org/schema/p”
P名称空间的使用方法是这样的,在<bean></bean>建立完成之后,直接在<bean>中使用P:的格式进行赋值。
这样也能达到为bean进行赋值的效果。
对于上面进行赋值的几种方法,我们在直接获取到ioc对象之后,调用期getBean方法就可以获取到对象的bean,并且可以获取到其中某一个属性的值。
我们来演示一下: