Spring装配Bean(三)

通过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:属性名="属性值"引入字面量


猜你喜欢

转载自blog.csdn.net/ditto_zhou/article/details/80416534