我们可以在Spring的配置文件中直接设置Bean的属性值。例如:你的Bean有一个“maxSize”属性,它表示每页显示数据的最大值,它有一个set方法。代码如下:
private int maxSize;
public void setMaxSize(int maxSize) {
this.maxSize = maxSize;
}
这样,你可以在Bean定义时设置这个属性的值:
<property name="maxSize"><value>20</value></property>
前面介绍了Bean原始类型的属性设置。这种方式已经可以非常有效而便利的参数化应用对象。然而,Bean工厂的真正威力在于:它可以根据bean属性中描述的对象依赖来组装(wire)bean实例。例如:userDao对象的一个属性“sessionFactory”引用了另外一个Bean对象,即userDao对象实例依赖于sessionFactory对象:
<bean id="userDao" class="com.dev.spring.simple.HibernateUserDao">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
…..
</bean>
在这个简单的例子中,使用<ref>元素引用了一个sessionFactory实例。在ref标签中,我们使用了一个“local”属性指定它所引用的Bean对象。除了local属性之外,还有一些其它的属性可以用来指定引用对象。下面列出<ref>元素的所有可用的指定方式:
bean:可以在当前文件中查找依赖对象,也可以在应用上下文(ApplicationContext)中查找其它配置文件的对象。
local:只在当前文件中查找依赖对象。这个属性是一个XML IDREF,所以它指定的对象必须存在,否则它的验证检查会报错。
external:在其它文件中查找依赖对象,而不在当前文件中查找。
总的来说,<ref bean="..."/>和<ref local="..."/>大部分的时候可以通用。“bean”是最灵活的方式,它允许你在多个文件之间共享Bean。而“local”则提供了便利的XSpring的bean工厂不仅允许用String值和其他bean的引用作为bean组件的属性值,还支持更复杂的值,例如数组、java.util.List、java.util.Map和java.util.Properties。数组、set、list和map中的值不仅可以是String类型,也可以是其他bean的引用;map中的键、Properties的键和值都必须是String类型的;map中的值可以是set、list或者map类型 。
例如:
Null:
<property name=“bar”><null/></property>
List和数组:
<property name=“bar”>
<list>
<value>ABC</value>
<value>123</value>
</list>
</property>
Map:
<property name=“bar”>
<map>
<entry key=“key1”><value>ABC</value></entry>
<entry key=“key2”><value>123</value></entry>
</map>
</property>
xML验证
Bean工厂使用Bean的构造函数创建Bean对象之后,紧接着它会做一件非常重要的工作——Bean的初始化。它会根据配置信息设置Bean的属性和依赖对象,执行相应的初始化方法。
自动装配
一般不推荐在大型的应用系统中使用自动装配。当然,它可以很好的用于小型应用系统。如果一个bean声明被标志为“autowire(自动装配)”,bean工厂会自动将其他的受管对象与其要求的依赖关系进行匹配,从而完成对象的装配——当然,只有当对象关系无歧义时才能完成自动装配。因为不需要明确指定某个协作对象,所以可以带来很多的便利性。
举个例子,如果在Bean工厂中有一个SessionFactory类型的实例,HibernateUserDao的sessionFactory属性就可以获得这个实例。这里可以使用<bean>的autowire属性,就象这样:
<bean id="userDao" class="com.dev.spring.simple.HibernateUserDao" autowire=”byType”>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
…..
</bean>
注意,在userDao的定义中并没有明确引用sessionFactory。由于它的“autowire”被设置为“byType”,所有只要userDao有一个类型为SessionFactory的属性并有一个set方法,Bean工厂就会自动将sessionFactory组装到userDao中。
如果一个应用有两个数据库,这时就对应有两个SessionFactory。这时autowire="byType"就无法使用了。我们可以使用另外一种自动装配方式“byName”。它将根据属性的名称来匹配依赖对象,这样如果你的配置文件中可以同时存在多个类型相同的SessionFactory,只要他们定义的名称不同就可以了。这种方式的缺点是:需要精确匹配Bean的名称,即必须要保证属性的名称和它所依赖的Bean的名称相等,这样比较容易出错。
如果你希望Bean严格的设置所有的属性,“dependency-check”(依赖检查)属性将会非常有用。它默认为“none”,不进行依赖检查。“simple”会核对所有的原始类型和String类型的属性。“objects”只做对象间的关联检查(包括集合)。“all”会检查所有的属性,包括“simple”和“objects”。
举个例子:一个Bean有如下的一个属性:
private int intVar = 0;
public void setIntVar(int intVar) {
this.intVar = intVar;
}
这个Bean的配置文件设置了“dependency-check=”simple””。如果这个Bean的配置中没有定义这个属性“intVar”,则在进行这个Bean的依赖检查时就会抛出异常:org.springframework.beans.factory.UnsatisfiedDependencyException。
setXXX()
set方法非常简单,它会给class注入所有依赖的属性。这些属性都必须是在配置文件中使用<property>元素定义,它们可以是原始类型,对象类型(Integer,Long),null值,集合,其它对象的引用。
private int maxSize;
public void setMaxSize(int maxSize) {
this.maxSize = maxSize;
}
这样,你可以在Bean定义时设置这个属性的值:
<property name="maxSize"><value>20</value></property>
前面介绍了Bean原始类型的属性设置。这种方式已经可以非常有效而便利的参数化应用对象。然而,Bean工厂的真正威力在于:它可以根据bean属性中描述的对象依赖来组装(wire)bean实例。例如:userDao对象的一个属性“sessionFactory”引用了另外一个Bean对象,即userDao对象实例依赖于sessionFactory对象:
<bean id="userDao" class="com.dev.spring.simple.HibernateUserDao">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
…..
</bean>
在这个简单的例子中,使用<ref>元素引用了一个sessionFactory实例。在ref标签中,我们使用了一个“local”属性指定它所引用的Bean对象。除了local属性之外,还有一些其它的属性可以用来指定引用对象。下面列出<ref>元素的所有可用的指定方式:
bean:可以在当前文件中查找依赖对象,也可以在应用上下文(ApplicationContext)中查找其它配置文件的对象。
local:只在当前文件中查找依赖对象。这个属性是一个XML IDREF,所以它指定的对象必须存在,否则它的验证检查会报错。
external:在其它文件中查找依赖对象,而不在当前文件中查找。
总的来说,<ref bean="..."/>和<ref local="..."/>大部分的时候可以通用。“bean”是最灵活的方式,它允许你在多个文件之间共享Bean。而“local”则提供了便利的XSpring的bean工厂不仅允许用String值和其他bean的引用作为bean组件的属性值,还支持更复杂的值,例如数组、java.util.List、java.util.Map和java.util.Properties。数组、set、list和map中的值不仅可以是String类型,也可以是其他bean的引用;map中的键、Properties的键和值都必须是String类型的;map中的值可以是set、list或者map类型 。
例如:
Null:
<property name=“bar”><null/></property>
List和数组:
<property name=“bar”>
<list>
<value>ABC</value>
<value>123</value>
</list>
</property>
Map:
<property name=“bar”>
<map>
<entry key=“key1”><value>ABC</value></entry>
<entry key=“key2”><value>123</value></entry>
</map>
</property>
xML验证
Bean工厂使用Bean的构造函数创建Bean对象之后,紧接着它会做一件非常重要的工作——Bean的初始化。它会根据配置信息设置Bean的属性和依赖对象,执行相应的初始化方法。
自动装配
一般不推荐在大型的应用系统中使用自动装配。当然,它可以很好的用于小型应用系统。如果一个bean声明被标志为“autowire(自动装配)”,bean工厂会自动将其他的受管对象与其要求的依赖关系进行匹配,从而完成对象的装配——当然,只有当对象关系无歧义时才能完成自动装配。因为不需要明确指定某个协作对象,所以可以带来很多的便利性。
举个例子,如果在Bean工厂中有一个SessionFactory类型的实例,HibernateUserDao的sessionFactory属性就可以获得这个实例。这里可以使用<bean>的autowire属性,就象这样:
<bean id="userDao" class="com.dev.spring.simple.HibernateUserDao" autowire=”byType”>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
…..
</bean>
注意,在userDao的定义中并没有明确引用sessionFactory。由于它的“autowire”被设置为“byType”,所有只要userDao有一个类型为SessionFactory的属性并有一个set方法,Bean工厂就会自动将sessionFactory组装到userDao中。
如果一个应用有两个数据库,这时就对应有两个SessionFactory。这时autowire="byType"就无法使用了。我们可以使用另外一种自动装配方式“byName”。它将根据属性的名称来匹配依赖对象,这样如果你的配置文件中可以同时存在多个类型相同的SessionFactory,只要他们定义的名称不同就可以了。这种方式的缺点是:需要精确匹配Bean的名称,即必须要保证属性的名称和它所依赖的Bean的名称相等,这样比较容易出错。
如果你希望Bean严格的设置所有的属性,“dependency-check”(依赖检查)属性将会非常有用。它默认为“none”,不进行依赖检查。“simple”会核对所有的原始类型和String类型的属性。“objects”只做对象间的关联检查(包括集合)。“all”会检查所有的属性,包括“simple”和“objects”。
举个例子:一个Bean有如下的一个属性:
private int intVar = 0;
public void setIntVar(int intVar) {
this.intVar = intVar;
}
这个Bean的配置文件设置了“dependency-check=”simple””。如果这个Bean的配置中没有定义这个属性“intVar”,则在进行这个Bean的依赖检查时就会抛出异常:org.springframework.beans.factory.UnsatisfiedDependencyException。
setXXX()
set方法非常简单,它会给class注入所有依赖的属性。这些属性都必须是在配置文件中使用<property>元素定义,它们可以是原始类型,对象类型(Integer,Long),null值,集合,其它对象的引用。