Spring-装配Bean

通过构造器注入对象引用

保证必须有公开的构造器才能使用这种方法

1
2
3
4
5
6
<bean id="sonnet29" class="com.mj.springAction.chapter2.SpringIdo1.Sonnet29" />
<bean id="jukePoem" class="com.mj.springAction.chapter2.SpringIdo1.JugglerPoem">
<constructor-arg value="15" />
<constructor-arg ref="sonnet29" />
</bean>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class JugglerPoem extends Juggler{
private Poem poem ;
public JugglerPoem(Poem poem ){
super() ;
this.poem = poem ;
}
public JugglerPoem(int beanBags,Poem poem){
super(beanBags) ;
this.poem = poem ;
}
public void perform(){
super.perform();
System.out.println("While reciting ...");
poem.recite();
}
}

通过工厂方法创建Bean

有时候静态工厂方法是唯一实例化对象的方法,Spring支持通过factory-method属性装配工厂创建的Bean.
如下是一个典型的单例类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 单例类
* @author mingjing
*
*/
public class SingleStageInstance {
private SingleStageInstance(){
}
//延迟加载实例
private static class singleInstanceHolder{
static SingleStageInstance instance= new SingleStageInstance() ;
}
//返回实例
public static SingleStageInstance getInstance(){
return singleInstanceHolder.instance ;
}
}

bean元素有一个factory-method属性,允许我们调用一个指定的静态方法,从而代替公开的构造方法,创建一个类的实例.

1
2
3
<bean id="singleInstance" class="com.mj.springAction.chapter2.SpringIdo1.SingleStageInstance"
factory-method="getInstance" />

Bean的作用域

Spring默认scope是singleton,在一个Spring容器中,一个Bean定义只有一个对象实例(不同于java中设计模式的单例模式,java设计模式的单例模式是整个jvm中只有一个对象实例,而这里的作用域是指的一个Spring容器,即每个应用上下文中只有一个.)
如果要想每次请求都产生唯一的一个是实例,scope就是prototype.

初始化和销毁bean时,还可以设置init-method, destroy-method.init-method在bean实例化后立即调用,destroy-method在该bean从容器销毁或者移除前立即调用.

如果所有bean都要设置相同的初始化方法和销毁方法,可以设置默认的default-init-method,default-destroy-method.

注入Bean属性

利用类似下面的注入方式注入setter方法的值,
注入简单类型的值,不需要指定类型,spring会根据属性的类型自动判断value的类型.下面的例子就回自动注入string类型的值.

1
2
3
public void setName(String name) {
this.name = name;
}

1
2
3
<bean id="ordinaryMen" class="com.mj.springAction.OrdinaryMen" >
<property name="name" value="xiaoming"/>
</bean>

引用其它bean

引用其它bean时使用ref指定:

1
<property name="name" ref="name"/>

内部Bean

内部bean是指定义在其它bean内部的bean

1
2
3
4
5
<bean id="ordinaryMen" class="com.mj.springAction.OrdinaryMen" >
<property name="name" >
<bean class="com.mj.springAction.Name" />
</property>
</bean>

没有定义bean id.不可复用.所以内部Bean仅适用于一次性注入,而且也不能被其它bean所引用.
使用内部bean定义会影响spring xml配置的可读性,尽量避免使用

装配集合

  1. < list >:装配list类型的值,允许重复.
  2. < set >:装配set类型的值,不允许重复.
  3. < map>:装配map类型的值,名称和值可以是任意类型.
  4. < props>:装配properties类型的值,
    名称和值必须是String类型.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <bean id="oneMenBand" class="com.mj.springAction.chapter2.SpringIdo1.OneMenBand">
    <property name="instruments">
    <list>
    <ref bean="guitar" />
    <ref bean="piano" />
    <ref bean="cymbal" />
    </list>
    </property>
    </bean>

只要是集合类型都可以用list或者set表示,只不过set要求不能重复.

装配map:

1
2
3
4
5
6
7
8
9
<bean id="oneMenBand" class="com.mj.springAction.chapter2.SpringIdo1.OneMenBand">
<property name="instruments">
<map>
<entry key="guitar" value-ref="guitar"/>
<entry key="cymbal" value-ref="cymbal"/>
<entry key="piano" value-ref="piano"/>
</map>
</property>
</bean>

装配properties(key -value都必须是String类型):

1
2
3
4
5
6
7
8
9
<bean id="oneMenBand" class="com.mj.springAction.chapter2.SpringIdo1.OneMenBand">
<property name="instruments">
<props>
<prop key="guitar" >strum strum strum</prop>
<prop key="cymbal">crash crash crash</prop>
<prop key="piano" >qing qing qing</prop>
</props>
</property>
</bean>

装配空值

如果有默认值,我们不能完全保证属性值是null,可以显示为该属性装配一个null值.

1
2
3
<property name="someNonNullProperty">
<null />
</property>

热评文章