基础:三种方式定义Bean

 

1. 普通方式

用setter配置属性:

<bean name="实例化后的名称" class="包名.类名">
  <property name="变量名">
    <value>变量值</value>
  </property>
  <property name="变量名">
    <value>变量值</value>
  </property>
</bean>

 

用构造器配置属性:(按照构造器顺序设置变量,无需变量名称)

<bean name="实例化后的名称" class="包名.类名">
  <constructor-arg>
    <value>变量值</value>
  </constructor-arg>
  <constructor-arg>
    <value>变量值</value> 
  </constructor-arg>
</bean>

 

2.快捷方式

用setter配置属性:

<bean name="实例化后的名称" class="包名.类名">
  <property name="变量名" value="变量值" />
  <property name="变量名" value="变量值"/>
</bean>

用构造器配置属性:

<bean name="实例化后的名称" class="包名.类名">
  <constructor-arg value="变量值" />
  <constructor-arg value="变量值" />
</bean>

 

3.p Schema方式

文件头添加: xmlns:p="http://www.springframework.org/schema/p"
<bean name="实例化后的名称" class="包名.类名" p:变量名="值" p:变量名="值">

 

注1:Spring对于基本类型的值,会试着将“变量值”转换成“变量“声名的类型。

注2:bean的name不是必须的值,省略后的bean称为匿名bean(anonymous Bean)。

注3:可以使用XML的id属性,在设计阶段编译器可以帮助检查id是否唯一,但是id不支持部分特殊字符。如:Bean的name支持逗号分隔多个名称,但是XML的id不支持逗号。

注4:在构造器配置中,可以显式的为参数指定参数类型,以及参数在构造器中出现的顺序。(int,String   与 String,int  类型的构造器,在Spring中会忽略出现顺序,使用匹配性进行打分,选出合适的构造器。此时容易照成混淆,需要显式指定)

指定方法为: 

<bean name="实例化后的名称" class="包名.类名">
  <constructor-arg type="值类型" index="0" value="变量值" />
  <constructor-arg type="值类型" index="1" value="变量值" />
</bean>

 

扩展:

1.引用其他Bean实例

<property name="变量名">
    <ref bean="Bean实例名" />
  </property>

 

或:

 

<property name="变量名" ref="Bean实例名" />

或:

  <bean id="实例化后的名称" class="包名.类名" p:变量名-ref="实例名" />

若该实例在同一个XML配置文件中,可以使用local属性代替bean,编辑器可以在编辑时验证该ID是否存在。

 

2.Collection类型参数  (List、ArrayList、Set、Map、Properties)

<property name="参数名" >
  <list value-type="此list所有值的类型">
    <ref local="变量值" />
    <ref local="变量值" />
    <value type="单个值的类型">变量值</value>
  </list>
</property>
 
<map>
  <entry>
    <key>
      <value>键</value>
    </key>
    <value>值</value>
  </entry>
  <entry>
    <key>
      <value>键</value>
    </key>
    <bean id="值" />
  </entry>
  <entry key="键" value="值">
</map>
对应5种标签为:<list>、<list>、<set>、<map>、<props>

 

注1:默认值类型为String。若需要其他类型的集合,需要手动设置值类型。

注2:JAVA1.5以上版本里,若java文件中已经定义该集合为某种类型,Spring会默认该list为java中指定的值类型。

注3:继承父Bean的集合时,可以合并父集合和子集合。

<list merge="true">

<list>会在父集合后附加子集合;

<set>、<map>附加子集合,并且覆盖相同属性的值。

 

3.声名内部Bean

<property name="变量名">
    <beean>
    </bean>
  </property>
 
或:
  <constructor-arg>
    <bean>
    </bean>
  </constructor-arg>
无需定义Bean的name和id,定义了也会被Spring忽略。

4.依赖检查  (检查xml中的bean实例化时某类属性是否有遗漏属性未赋值)

 <bean dependency-check="检查模式">

检查模式:none  不检查;

                  simple  只检查原始类型和集合类型;

                  objects  只检查对象类型(除去简单类型);

                  all  检查所有类型。

检查Bean中的变量是否使用setter方式赋值,不保证赋予了null的值,只保证有赋值动作。

并且必须由setter方式赋值,构造器赋值的依旧会报错。

 

注:可以对<beans> 中的default-dependency-check属性设置检查模式,该处设置全体bean的默认检查模式。<bean>中设置的模式可以覆盖全局模式。

 

 5.@Required 注解检查 (对特定属性检查是否有赋值动作)

在需要检查的set方法前添加 @Required 注解。

Spring2.5中需要在Bean配置文件中添加:

文件头添加: xmlns:context="http://www.springframework.org/schema/context"
                            xsi:schemaLocation="http://www.springframework.org/schema/context
                                                               http://www.springframework.org/schema/context/spring-context-2.5.xsd"
     <beans>
         <context:annotation-config />
    </beans>

Bean Factory 则需要在API中注册RequiredAnnotationBeanPostProcessor实例。

Application Context 中则需要声明一个实例:

  <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />

 

在注册完 RequiredAnnotationBeanPostProcessor 实例后,这个Bean后置处理器在Bean实例化后检查被注释的属性是否有赋值动作,不保证被赋予了null值。

 

注:可以自定义注解,并且在Bean后置处理器中注册,在Bean实例化时就会自动检查了。

 

6.XML配置中的Bean自动装配

<bean autowire="自动装配模式" >

自动装配模式:no  不执行自动装配,必须是显式装配;

                         byName  根据Bean实例名称与该属性名称是否匹配装配;

                         byType  根据Bean类型是否与该属性的类型是否相符装配,多个同时匹配时报错;

                         constructor  根据构造器自动装配,有冲突报错;

                         autodetect  找到没有默认参数构造器时使用 byType模式,否则使用constructor模式。

 

使用自动装配会降低XML配置文件的可读性。在复杂的应用程序中不推荐使用。

7.使用@Autowired和@Resource 自动装配

 

8.继承Bean配置

<bean id="实例化后的名称" parent="父Bean的id" />

可以继承父Bean的所有配置,并且可以在必要的时候覆盖父Bean配置的属性。

可以避免相同类型的重复属性的赋值冗余。特别适合同时实例化多个相似的Bean。

 

可以设置<bean>为抽象的,不会被Spring实例化。依旧可以被继承。

<bean id="bean的id" abstract="true" />

对于拥有相同属性名称,但是没有直接关系的类需要同名属性相同初始化值。

class A  属性 int x; int y;
class B  属性 int x;
设置没有class的抽象父Bean:
<bean id="c" abstract="true">
  <property name="x" value="1" />
</bean>
继承此抽象<bean>:
<bean id="a" class="A" parent="c">
  <property name="y" value="2" />
</bean>
<bean id="b" class="B" parent="c" />
此时两个实力的x属性同时被赋予了”1“。

注1:部分属性不能被继承。如:autowire和dependency-check 。

注2:集合属性的继承,详情请看 2.Collection类型参数 部分

9.工厂Bean和Utility Schema 定义集合

 

 

 

 

 

 参考:《Spring攻略》  作者:Gary Mak(澳门)