首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring依赖注入配备详解

2012-10-18 
Spring依赖注入配置详解?? bean的属性及构造器参数既可以引用容器中的其他bean,也可以是内联(inline)bean。

Spring依赖注入配置详解

?? bean的属性及构造器参数既可以引用容器中的其他bean,也可以是内联(inline)bean。在spring的XML配置中使用<property/>和<constructor-arg/>元素定义。

???? 1.直接变量(基本类型、<bean id="myDataSource" destroy-method="close"> <!-- results in a setDriverClassName(String) call --> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/mydb</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>masterkaoli</value> </property></bean>

?可以在<property/> 和<constructor-arg/> 元素内部使用'value' 属性,这样会使我们的配置更简洁,比如下面的配置:

<bean id="myDataSource" destroy-method="close">    <!-- results in a setDriverClassName(String) call -->  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>  <property name="username" value="root"/>  <property name="password" value="masterkaoli"/></bean>

Spring团队更倾向采用属性方式(使用<bean id="mappings" name="code"><bean id="theTargetBean" /> </property></bean>

?上述bean定义片段完全地等同于(在运行时)以下的片段:

<bean id="theTargetBean" /><bean id="client" value="theTargetBean" /></bean>

第一种形式比第二种更可取的主要原因是,使用idref标记允许容器在部署时 验证所被引用的bean是否存在。而第二种方式中,传给client bean的targetName属性值并没有被验证。任何的输入错误仅在client bean实际实例化时才会被发现(可能伴随着致命的错误)。如果client bean 是prototype类型的bean,则此输入错误(及由此导致的异常)可能在容器部署很久以后才会被发现。

? 此外,如果被引用的bean在同一XML文件内,且bean名字就是bean id,那么可以使用local属性,此属性允许XML解析器在解析XML文件时对引用的bean进行验证。

<property name="targetName">   <!-- a bean with an id of 'theTargetBean' must exist; otherwise an XML exception will be thrown -->   <idref local="theTargetBean"/></property>

??? 上面的例子中,与在ProxyFactoryBean bean定义中使用<idref/>元素指定AOP interceptor的相同之处在于:如果使用<idref/>元素指定拦截器名字,可以避免因一时疏忽导致的拦截器ID拼写错误。

?

3.引用其它的bean(协作者)

????? 在<ref bean="someBean"/>

? ? ? 第二种形式是使用ref的<ref local="someBean"/>

?? 第三种方式是通过使用ref的 <!-- in the parent context --> <bean id="accountService" name="code"><!-- in the child (descendant) context --><bean id="accountService" <-- notice that the name of this bean is the same as the name of the 'parent' bean name="code"><bean id="outer" value="Fiona Apple"/> <property name="age" value="25"/> </bean> </property></bean>

?注意:内部bean中的scope标记及id或name属性将被忽略。内部bean总是匿名的且它们总是prototype模式的。同时将内部bean注入到包含该内部bean之外的bean是不可能的。

?

5.集合类型

通过package example;public class ExampleBean {private Set<String> sets = new HashSet<String>();private List<String> lists = new ArrayList<String>();private Properties properties = new Properties();private Map<String, String> maps = new HashMap<String, String>();public Map<String, String> getMaps() {return maps;}public void setMaps(Map<String, String> maps) {this.maps = maps;}public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}public Set<String> getSets() {return sets;}public void setSets(Set<String> sets) {this.sets = sets;}public List<String> getLists() {return lists;}public void setLists(List<String> lists) {this.lists = lists;}}

?xml配置文件如下:

<bean id="personService" value="value-1"/>          <entry key="key-2" value="value-2"/>          <entry key="key-3" value="value-3"/>          </map>          </property>          </bean>
?
<bean id="moreComplexObject" />    </list>  </property>  <!-- results in a setSomeMap(java.util.Map) call -->  <property name="someMap">    <map>        <entry>            <key>                <value>an entry</value>            </key>            <value>just some string</value>        </entry>        <entry>            <key>                <value>a ref</value>            </key>            <ref bean="myDataSource" />        </entry>    </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

?

?