基础:三种方式定义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(澳门)