当前位置:编程学习 > JAVA >>

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 ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,