一.声明一个简单的<bean>
如果使用XML文件来装备bean的话,那么<bean>标签是不可或缺的,首先我个人认为,bean其实就是一个对象,我们通过配置bean将对象置于一个容器中去,当我们需要时,这个容器就能够传递给我们需要的对象。
<bean>标签经常用到的属性有两个 id , class ,id 属性的值其实就相当于bean的名字,也就是对象的名字,而class属性的值则是通过类的全限定名(反射)来指定bean的类型,当我们Spring发现<bean>这个标签时,它会调用class属性所指定的类的默认构造器来创建bean,所以如果我们没有通过构造器形式(也就是<constructor-arg>标签)来初始bean的话,我们一定要给类提供一个无参构造方法
二.通过构造器注入初始化bean
我们可以在<bean>标签的下方声明若干个<constructor-arg>标签,每个标签都相当于类构造方法中的一个field(属性),或者我们可以使用c-命名空间来实现构造器初始化。
<constructor-arg>标签常用的属性有value,index,ref和type,value表示参数的值,index表示是第几个参数,type表示值的类型,ref表示外部应用的值,比如:
<constructor-arg value="shanghai" index="0" type="java.lang.String"></constructor-arg>
c-命名空间相对于<constructor-arg>标签则显得更加的简洁,可以直接通过c:构造器参数名=要注入的值或者c:构造器参数名-ref=要注入的bean的id 这样的形式来实现通过构造器注入bean,比如:
<bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd="compactDisc">
或者我们可以使其更加短小一些,直接通过参数在参数列表的位置信息来实现注入,c:_0=要注入的值(c:_0-ref=要注入的bean的id),0表示参数的索引,因为XML中不允许数字作为属性的第一个字符,因此需要添加一个下划线作为前缀,比如:
<bean id="cdPlayer" class="soundsystem.CDPlayer" c:_0="compactDisc" c:_1="hahahah">
三.设置属性
如果我们选择属性注入的方式来初始化bean的话,那么一定要保证类中有无参构造方法,否则将会报错。
我们可以在<bean>标签的下方声明若干个<property>标签,每个标签都相当于类中的一个field(属性),或者我们可以使用p-命名空间来实现属性注入
<property>标签常用的属性有name,value和ref,name的值表示类中属性的名字(更详细一点,应该是setter方法的名字),value的值表示表示注入到类中属性的值,ref表示外部引用的值,比如:
<property name="brand" value="hahahahah" ></property>
p-命名空间的用法与c-命名空间的用法类似,即p:属性名=要注入的属性值 或 p:属性名=要注入的bean的id,比如:
<bean id="cdPlayer" class="soundsystem.CDPlayer" p:compactDisc="compactDisc">
四.列表bean
通过util-命名空间所提供的功能之一<util:list>,我们可以创建一个列表bean,我们可以外部引用该列表bean来实现List类型属性的注入,具体实现如下:
<util:list id="trackList">
<value>hello</value>
<value>world</value>
</util:list>
我们可以通过其id引用这个bean,比如:
<constructor-arg ref="trackList" index="0">
当然,除了<value>这个子标签,<util:list>还有许多的子标签,这里就不一一列举了。
五.内部bean
我们可以在<property>标签或<constructor-arg>标签的内部将bean作为其子标签来实现内部bean,由于内部bean无法被外部引用且会直接将其注入到属性或参数中去,因此无需设置id属性