通过xml配置Bean
1.创建xml规范
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" >
在使用xml时候需要在配置文件的顶部声明多个xml模式(XSD)的文件,这些文件定义了配置Spring的xml元素
用来装配bean的最基本的xml元素包含在spring-bean模式之中,<beans>是该模式的一个元素,它是所有spring配置文件的根元素
2. 声明一个简单的bean
<bean id="exampleBean" class="com.erong.service.ExampleBean"/>
class: 属性是类的全类名,id 作为bean的标识
需要注意的是:
1> spring发现这个bean元素时候,将会调用默认构造器创建bean
2> class属性的全类名,无法保证合法性,即无法保证是一个存在的类
* 借助构造器注入初始化bean
如果想要创建bean的同时,采用有参的构造器创建bean,而不是采用默认的构造器
<constructor-arg>元素
* 构造器引入bean引用 <constructor-arg ref="beanID"> ,将一个bean引入到构造器中
c-命名空间
作为替代方案,也可以使用Spring的c-命名空间,c-命名空间是Spring3.0中引入的,首先需要在xml顶部声明
使用它声明构造器参数
<bean id = "cdPlayer" class = "soundsystem.CDPlayer" c:cd-ref="compactDis"/>
c:cd-ref = "compactDisc" ,cd表示构造器参数名,-ref表示注入的是bean引用
或者使用c:_0-ref = "beanID" 来进行表示,将参数名称替换为0表示,是构造器中的第一个参数
* 将字面量注入到构造器中
构造器标签表示
<bean id = "compactDisc" class = "" >
<!-- 顺序和构造器中参数顺序一致 -->
<constructor-arg value = "club Band"/>
<constructor-arg value = "The Beatles"/>
</bean>
如果要使用c-命名空间,进行表示
<bean class = "" c:_title = "club Band" c:_artist = "The Beatles"/> c:_title 下划线后的名称为构造器中的参数名称
装配集合
存在下面类,类的成员变量中存在集合类型,如何在创建bean的是否,赋值字面常量
将集合类型的参数,在注入是否赋值为null,如果调用这个参数的话,就会抛出空指针
<constructor-arg value = "Club Band"/>
<constructor-arg value = "The Beatles"/>
<constructor-arg ><null/><construtor-arg/>
* list标签实现集合的装配
<list>元素是构造器标签的子元素
1. 注入常量
<constructor-arg>
<list>
<value >1</value>
.....
</list>
</constructor-arg>
2. <ref>标签实现引用bean的装配
<constructor-arg>
<list>
<ref bean = ""></ref>
</list>
</construtcor-arg>
* set 标签和list标签类似
设置属性
按照属性注入,存在一个类:
public class CDPlayer { private CompactDisc cd; public CDPlayer(){} public CDPlayer(CompactDisc cd){ this.cd = cd; } public CompactDisc getCd() { return cd; } @Autowired public void setCd(CompactDisc cd) { this.cd = cd; } public void play(){ cd.play(); } }
<context:annotation-config/> <bean id="cdplayer" class="com.erong.service.CDPlayer"></bean> <bean class="com.erong.service.SgtPeppers"></bean>
这种情况下,Spring上下文,cdplayer默认调用无参数的构造函数创建bean,但是在CDPlayer类的set方法上加上了
@Autowire标签,Spring上下文就会自动找到合适的bean进行注入,如果将@Autowire标签移除,就会报错。
这种情况下, 如何注入bean,改动bean.xml 文件如下:
<bean id="cdplayer" class="com.erong.service.CDPlayer"> <property name="cd" ref="sgtp"></property> </bean> <bean id="sgtp" class="com.erong.service.SgtPeppers"></bean>
<property>标签实现属性的注入,name表示属性名称,ref表示bean引用,另外value表示常量值
而且,必须存在对应的set方法才能完成属性的注入,这点需要注意,假如,我们将属性cd的set方法删除,执行测试,就会报错
Bean property 'cd' is not writable or has an invalid setter method.
* 将字面量注入到属性中
<bean id="sgtp" class="com.erong.service.SgtPeppers"> <property name="title" value="Sgt.Pepper's Hearts Club Band "></property> <property name="artist" value="The Beatles"></property> <property name="list"> <list> <value>1</value> <value>1</value> <value>1</value> <value>1</value> </list> </property> </bean>
property 属性value表示注入的常量值
property和construction-arg标签一样,有子标签list,set完成集合类型的注入
* 另外Spring提供p命名空间作为property标签的替换方案
<bean id = "" class = "" p:属性名=“属性值"/>
p:属性名-ref = "beanID" 引入bean引用 或者 p:属性名="属性值"引入字面量