Spring注入

以redis爲例子對spring配置文件的注入進行詳述下:
在配置文件中有一個配置文件,名稱爲: spring-config-redis.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
    default-autowire="byName">
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="500" />
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="jedis.shardInfo1" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="${redis.host1}" />
        <constructor-arg index="1" value="${redis.port1}" />
    </bean>

    <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
        <constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1">
            <list>
                <ref bean="jedis.shardInfo1" />
            </list>
        </constructor-arg>
    </bean>

    <bean id="redisUtil" class="com.diligrp.website.util.redis.impl.RedisUtilImpl">
        <property name="shardedJedisPool" ref="shardedJedisPool" />
    </bean>

    <bean id="manageRedisUtil" class="com.diligrp.website.util.redis.impl.RedisUtilImpl">
        <property name="shardedJedisPool" ref="shardedJedisPool" />
    </bean>

</beans>

如上,spring通過bean層層注入的,在class="com.diligrp.website.util.redis.impl.RedisUtilImpl"裏面有一個屬性名爲shardedJedisPool 的屬性 (private ShardedJedisPool shardedJedisPool;),但是shardedJedisPool 也是一個Object類型,.
class="redis.clients.jedis.ShardedJedisPool",是通過構造函數進行注入的的如下:
<constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1">
            <list>
                <ref bean="jedis.shardInfo1" />
            </list>
        </constructor-arg>

這兩個構造函數裏面的參數分別是:
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="500" />
        <property name="testOnBorrow" value="true" />
    </bean>
在JedisPoolConfig類中有屬性:maxIdle ,testOnBorrow 所以這兩個值通過spring啓動時注入
<property />這種方式是通過屬性名稱的方式

    <bean id="jedis.shardInfo1" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="${redis.host1}" />
        <constructor-arg index="1" value="${redis.port1}" />
    </bean>
 <constructor-arg />這種方式的注入是通過構造函數的方式注入的

總結:
依賴注入的方式:  constructor-arg:通過構造函數注入。   property:通過setxx方法注入;
使用constructor-arg標籤的index屬性,對應於構造函數的多個參數,index屬性的值從0開始
使用constructor-arg的type屬性,避免構造子衝突(兩個參數一樣的構造函數,但是參數類型不一樣,這裏注入時需要加上type屬性,避免衝突)
注入集合屬性,使用list,map,set和props標籤,分別對應List,Map,Set和Properties;

另外注意:通過Spring創建的對象默認是單例的,如果需要創建多實例對象可以在<bean>標籤後面添加一個屬性:
  1. <bean name="..." class="..." scope="prototype">  

spring注入的幾種方法,1,2種方法用的偏多一點);
1、set注入
2、構造器注入
3、靜態工廠方法注入
4、實例工廠方法注入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章