SpringIOC學習_屬性注入(依賴注入)

1、應用場景:Spring會幫建立實現類的實例,可是有時候咱們還須要在類中設置一些屬性用於傳入設置值,這些跟類緊密關聯的屬性就叫依賴,經過spring幫忙設置的過程叫依賴注入。java

2、依賴注入的實現spring

 A.構造方法的注入。數組

//這樣配置bean都是經過無參構造生成bean實例
  <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl"/>

經過上面無參構造咱們想到是否有有參構造建立實例了,這樣不就達到了注入屬性的目的了嗎?確實,看下面:app

//java代碼:
private String name;
    public UserDaoImpl(String name) {
        this.name = name;
    }
    @Override
    public void insert() {
        
        System.out.println(name+"用戶信息插入");
    }

//配置文件
     <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl">
            <constructor-arg name="name" value="李四"/>
        </bean>

只提供了有參構造而沒有提供無參,因此如今Spring只能經過有參構造來建立實例,並注入屬性。ide

B.set方式注入。this

  這種方式就比較常見了,在須要實例化的類裏面提供屬性及其set方法。spa

//java類裏面:
private String name;
    
    @Override
    public void insert() {
        
        System.out.println(name+"用戶信息插入");
    }

    public void setName(String name) {
        this.name = name;
    }

配置文件裏:3d

 <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl">
    <!-- 屬性依賴注入,底層會自動封裝,只要在dao實現類提供屬性和set方法就行 -->
        <property name="name" value="張三"></property>
    </bean>

運行結果:代理

18:05:18,439  INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 18:05:18 CST 2019]; root of context hierarchy
18:05:18,461  INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
張三用戶信息插入

C.構造或者set設置非普通屬性(對象或者數組等引用類型)code

//在須要Spring代理的實體類中用set或者構造
    private Car car;
    
    /*public UserDaoImpl(Car car) {
        this.car = car;
    }*/
    
    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public void insert() {
    
        System.out.println(car);
    }
    

主要看配置文件:

      <bean id="car" class="cn.xxx.bean.Car">
        <property name="carName" value="奇瑞QQ"></property>
        <property name="money" value="50000"></property>
    </bean>
     
    <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl">
        <!-- <constructor-arg name="car" ref="car"></constructor-arg> -->
        <!-- 非普通屬性注入,注意,ref爲引用其餘代理類的id或者name,這裏面name裏面car表明上面引用id的實例,必須保持一致,不然出錯 -->
        <property name="car" ref="car"></property>
    </bean>

也就是說只靠在實體類裏設置property不夠,咱們須要對象裏面每一個屬性的值,因此直接把bean類託管給Spring。在咱們須要的類裏面用ref屬性引入這個bean類

運行結果:

18:43:10,444 INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 18:43:10 CST 2019]; root of context hierarchy
18:43:10,476 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
Car [carName=奇瑞QQ, money=50000.0]

 

D.P名稱空間的屬性注入(Spring2.5版本之後)

  有點相似與表達式那種,能夠替換一些標籤,用處不大,瞭解一下。首先得引入p名稱空間(名稱空間是xml中的概念)

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"    
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

 

配置:

 <bean id="car" class="cn.xxx.bean.Car" p:carName="勞斯萊斯" p:money="12000000">
    </bean>
     
    <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" p:car-ref="car" p:name="王校長">    
    </bean>
    

就是將一些在property等標籤裏面寫的東西拿到了bean標籤上面寫,簡化了代碼量

 

E:SPEL的方式屬性注入(Spring3.x版本後使用)

  SpEL:Spring Expression Language(Spring表達式語言),語法:#{SpEL}

 

  <bean id="car" class="cn.xxx.bean.Car" >
        <property name="carName" value="#{'奔馳'}" ></property>
        <property name="money" value="#{600000}"></property>
    </bean>
     
    <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" >
        <!-- 注意無論數據類型複雜與否,都用value -->
        <property name="car" value="#{car}"></property>
        <!-- 引入另外一個類裏面的屬性 -->
        <!-- <property name="carName" value="#{car.carName}"></property> -->

運行:

20:43:14,694  INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 20:43:14 CST 2019]; root of context hierarchy
20:43:14,709  INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
Car [carName=奔馳, money=600000.0]
小周用戶信息插入

F:複雜數據類型注入(集合,數組)

配置文件:

 <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" >
        <property name="arrs">
            <array>
                <value></value>
                <value></value>
                <value></value>
            </array>
        </property>
        
        <!-- 定義list集合 -->
        <property name="list">
            <list>
                <value>芙蓉</value>
                <value>如花</value>
                <value>鳳姐</value>
            </list>
        </property>
        
        <!-- 定義map集合 ,key裏面有個key-ref,因此能夠傳引入類型-->
        <property name="map">
            <map>
                <entry key="aaa" value="111"></entry>
                <entry key="bbb" value="222"></entry>
                <entry key="ccc" value="333"></entry>
            </map>
        </property>
    </bean>
//bean裏面
private String[] arrs;
    private List<String> list;
    private Map<String,String> map;public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

運行結果:

21:27:48,113  INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 21:27:48 CST 2019]; root of context hierarchy
21:27:48,128  INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
你
我
它
芙蓉
如花
鳳姐
aaa...111
bbb...222
ccc...333

若是是set集合那麼就用set標籤。上面就是屬性注入全方位講解了。

相關文章
相關標籤/搜索