Spring4.3学习之依赖注入和控制反转
直接值引用:
idref元素:
idref只是简单的以误差检测的方式将容器中其他bean的id(字符串值而非引用bean)传递给<constructor-arg/>
或 <property/>
元素可以检测bean是否已经存在,类似于value属性,但是比其更好,因为能在容器部署时检查所引用http://i.cnblogs.com/EditPosts.aspx?opt=1bean是否已经存在。
注意,从4.0开始不再支持idref元素的local属性,因为其不支持正则形式的参考bean,可用idref bean属性代替。
引用其他的beans:
ref元素:
ref元素是<constructor-arg/>和<property/>里面的最终元素。能够引用容器管理的其他bean来设置指定的属性值。引用bean依赖于这个属性是否设置,且必须在属性设置之前初始化。(如果collaborator是一个singleton bean,其可能已经被容器初始化了。)所有的引用最后都是引用另一个对象。scopeing和validation依赖于是否指定id/name的对象通过bean,local,或parent属性。
通过bean标签的<ref/>属性指定目标bean是最常用的形式,而已创建在同一容器或父容器中的任意bean,不管是否在同一个xml文件中。ref中的bean属性相当于id/name属性。
通过parent属性创建一个在父容器中的bean的引用。
内部bean:
<constructor-arg/>和<property/>元素中的<bean/>叫内部bean。
1 <bean id="outer" class="..."> 2 <!-- instead of using a reference to a target bean, simply define the target bean inline --> 3 <property name="target"> 4 <bean class="com.example.Person"> <!-- this is the inner bean --> 5 <property name="name" value="Fiona Apple"/> 6 <property name="age" value="25"/> 7 </bean> 8 </property> 9 </bean>
内部bean不需要指定id/name,如果指定容器也不会将其用着标识,也会忽视scope属性。内部bean都是匿名的且由外部bean创建。不能注入到其他bean中,或独立访问它们。通常内部bean的scope跟外部bean的一样,但是允许destruction回调的scope不同。
Collections:
<list/>,<set/>,<map/>和<props/>元素来设置属性或参数为Java Collection形式的List,Set,Map,Properties类。
<bean id="moreComplexObject" class="example.ComplexObject"> <!-- results in a setAdminEmails(java.util.Properties) call --> <property name="adminEmails"> <props> <prop key="administrator">administrator@example.org</prop> <prop key="support">support@example.org</prop> <prop key="development">development@example.org</prop> </props> </property> <!-- results in a setSomeList(java.util.List) call --> <property name="someList"> <list> <value>a list element followed by a reference</value> <ref bean="myDataSource" /> </list> </property> <!-- results in a setSomeMap(java.util.Map) call --> <property name="someMap"> <map> <entry key="an entry" value="just some string"/> <entry key ="a ref" value-ref="myDataSource"/> </map> </property> <!-- results in a setSomeSet(java.util.Set) call --> <property name="someSet"> <set> <value>just some string</value> <ref bean="myDataSource" /> </set> </property> </bean>
map的key或value,set的value可以是以下的任意元素
bean|ref|idref|list|set|map|props|value|null
Collection合并: