Spring3开发实战 之 第二章:IoC/DI开发(2)
通过<list/>、<set/>、<map/>及<props/>元素可以定义和设置与Java Collection类型对应List、Set、Map及Properties的值 ,示例如下:
java代码:
[java]
<bean id="moreComplexObject" class="example.ComplexObject">
<property name="adminEmails">
<props>
<prop key="administrator">admin@somecompany.org</prop>
<prop key="support">support@somecompany.org</prop>
</props>
</property>
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource" />
</list>
</property>
<property name="someMap">
<map>
<entry>
<key> <value>yup an entry</value> </key>
<value>just some string</value>
</entry>
<entry>
<key> <value>yup a ref</value> </key>
<ref bean="myDataSource" />
</entry>
</map>
</property>
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myDataSource" />
</set>
</property>
</bean>
可以定义parent-style和child-style的<list/>、<map/>、<set/>或<props/>元素,子集合的值从其父集合继承和覆盖而来;也就是说,父子集合元素合并后的值就是子集合中的最终结果,而且子集合中的元素值将覆盖父集全中对应的值。
java代码:
[java]
<beans>
<bean id="parent" abstract="true" class="example.ComplexObject">
<property name="adminEmails">
<props>
<prop key="administrator">administrator@somecompany.com</prop>
<prop key="support">support@somecompany.com</prop>
</props>
</property>
</bean>
<bean id="child" parent="parent" class= " example.Child" >
<property name="adminEmails">
<props merge="true">
<prop key="sales">sales@somecompany.com</prop>
<prop key="support">support@somecompany.co.uk</prop>
</props>
</property>
</bean>
<beans>
在上面的例子中,childbean的adminEmails属性的<props/>元素上使用了merge=true属性。当child bean被容器实际解析及实例化时,其 adminEmails将与父集合的adminEmails属性进行合并 。
注意到这里子bean的Properties集合将从父<props/>继承所有属性元素。同时子bean的support值将覆盖父集合的相应值
不同的集合类型是不能合并(如map和 list是不能合并的),否则将会抛出相应的Exception。merge属性必须在继承的子bean中定义,而在父bean的集合属性上指定的merge属性将被忽略
在JDK5以上的版本里,Spring支持强类型集合
<null/>用于处理null值,Spring会把属性的空参数当作空字符串处理。
1:以下的xml片断将email属性设为空字符串。
<bean class="ExampleBean">
<property name="email"><value></value></property>
</bean>
这等同于Java代码: exampleBean.setEmail(“”)。
2:而null值则可以使用<null>元素可用来表示。例如:
<bean class="ExampleBean">
<property name="email"><null/></property>
</bean>
上述的配置等同于Java代码:exampleBean.setEmail(null)。
针对常见的value值或bean的引用,Spring提供了简化格式用于替代<value/>和<ref/>元素 。如下:
java代码:
[java]
<property name="myProperty">
<value>hello</value>
</property>
<property name="myProperty">
<ref bean="myBean">
</property>
<entry>
<key>
<ref bean="myKeyBean" />
</key>
<ref bean="myValueBean" />
</entry>
完全等同于
<property name="myProperty" value="hello"/>
<property name="myProperty" ref="myBean"/>
<entry key-ref="myKeyBean" value-ref="myValueBean"/>
强调一点
只有<ref bean=“xxx”>元素的简写形式,没有<ref local=“xxx”>的简写形式。也就是说<property name=“myProperty” ref=“myBean”/> 里面的ref是相当于<ref bean=“”>的形式。
组合属性名称
当设置bean的组合属性时,除了最后一个属性外,只要其他属性值不为null,组合或嵌套属性名是完全合法的。例如,下面bean的定义:
java代码:
[java]
<bean id="foo" class="foo.Bar">
<property name="fred.bob.sammy" value="123" />
</bean>
表示foo
bean有个fred属性,此属性有个bob属性,而bob属性又有个sammy属性,最后把sammy属性设置为123。为了让此定义能工作, foo的fred属性及fred的bob属性在bean被构造后都必须非空,否则将抛出NullPointerException异常。
depends-on,用于当前bean初始化之前显式地强制一个或多个bean被初始化。
示例:
java代码:
[java]
<bean id="beanOne" class="ExampleBean" depends-on="manager"/>
<bean id="manager" class="ManagerBean" />
若需要表达对多个bean的依赖,可以在'depends-on'中将指定的多个bean名字用分隔符进行分隔,分隔符可以是逗号、空格及分号等。下面的例子中使用了'depends-on'来表达对多个bean的依赖。
java代码:
[java]
<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
<property name="manager" ref="manager" />
</bean>
<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />
延迟初始化bean
1:ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化,这样可能会增大资源的消耗,但会加快程序的运行速度。
2:可以将bean设置为延迟实例化。在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
</bean>
3:在容器层次中通过在<beans/>元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置:
<beans default-lazy-init="true">
补充:软件开发 , Java ,