Spring DI 依賴注入案例

Spring DI 依賴注入案例(帶參數構造方法依賴注入和setter方法依賴注入和p名稱空間注入)

DI 依賴注入:
  簡單的說是指對象中的屬性的值設置方式不再是調用setter方法進行傳值,而是由配置實現經過框架傳值。
 
DI操作可以採用兩種實現方案:
    1、使用帶參構造實現注入

<!-- 採用帶參構造的方式實現依賴注入 -->
<bean id="user" class="cn.sz.pojo.User">
    <constructor-arg name="id" value="123"></constructor-arg>
</bean>

    2、使用setter方法實現注入

<!-- 採用setter方法實現依賴注入 -->
<bean id="user" class="cn.sz.pojo.User">
    <property name="id" value="13"></property>
</bean>

補充:constructor和property標籤中常用屬性:name,value,ref
  name 設置類中的屬性名
  value設置屬性的具體值
  ref設置bean的id(及關聯其它的配置項的id)

下面演示的是帶參數構造方法依賴注入和setter方法依賴注入方式:

項目中SpringTest.java測試類使用junit方式測試即單元測試。lib目錄下爲測試中需要的spring jar包,log4j.jar爲日誌包,User.java是測試需要的一個實體類,applicationContext.xml爲spring的主配置文件,名稱可以任意但官方建議使用該默認名稱。log4j.properties爲日誌配置文件。本案例使用的spring版本爲 spring4.3.9。

創建一個java項目,項目結構如下:

代碼如下:

1、applicationContext.xml (主配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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">    
    <!--DI操作(依賴注入) -->
    <!-- 方式一採用帶參構造的方式實現依賴注入 -->
    <bean id="user4" class="cn.sz.pojo.User">
        <constructor-arg name="id" value="123"></constructor-arg>
        <constructor-arg name="name" value="張三"></constructor-arg>
    </bean>
 
    <!-- 方式二:採用setter方法實現依賴注入 ,還演示了結合屬性的依賴注入 -->
    <bean id="user5" class="cn.sz.pojo.User">
        <property name="id" value="456"></property>
        <property name="name" value="李四"></property>
        <!-- 數組屬性依賴注入 -->
        <property name="strs">
            <array>
                <value>數組屬性1</value>
                <value>數組屬性2</value>
                <value>數組屬性3</value>
            </array>
        </property>
        <!-- list集合屬性依賴注入 -->
        <property name="list">
            <list>
                <value>list屬性1</value>
                <value>list屬性2</value>
                <value>list屬性3</value>
            </list>
        </property>
        <!-- set集合屬性依賴注入(set集合內容不能重複) -->
        <property name="set">
            <set>
                <value>set屬性1</value>
                <value>set屬性2</value>
                <value>set屬性3</value>
            </set>
        </property>
        <!-- map集合屬性依賴注入 -->
        <property name="map">
            <map>
                <entry key="key1" value="map集合屬性1"></entry>
                <entry key="key2" value="map集合屬性2"></entry>
                <entry key="key3" value="map集合屬性3"></entry>
 
            </map>
        </property>
 
        <!--Properties屬性依賴注入 -->
        <property name="properties">
            <props>
                <prop key="p1">Properties屬性1</prop>
                <prop key="p2">Properties屬性2</prop>
            </props>
        </property>
    </bean>
</beans>

2、log4j.properties (日誌文件)

[plain] view plain copy
<span style="font-family:Microsoft YaHei;font-size:18px;">log4j.rootLogger=DEBUG,console,FILE  
log4j.appender.console=org.apache.log4j.ConsoleAppender  
log4j.appender.console.threshold=INFO  
log4j.appender.console.layout=org.apache.log4j.PatternLayout  
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n  
log4j.appender.FILE=org.apache.log4j.RollingFileAppender  
log4j.appender.FILE.maxBackupIndex=100  
##log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.FILE.Append=true  
log4j.appender.FILE.File=c:/error1.log  
log4j.appender.FILE.Threshold=INFO  
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout  
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n  
log4j.appender.FILE.MaxFileSize=1MB  
</span>  


3、SpringTest.java (junit測試類)

package cn.sz.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.sz.pojo.User;
public class SpringTest {
    // 方法一:使用帶參構造方法實現依賴注入
    @Test
    public void testA() {
        // 讀取主配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user4 = ac.getBean("user4", User.class);
        System.out.println(user4.toString());
    }
 
    // 方法二: 使用setter方法實現依賴注入
    @Test
    public void testB() {
        // 讀取主配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user5 = ac.getBean("user5", User.class);
        System.out.println(user5.toString());
    }
}


4、User.java (用戶實體類)

package cn.sz.pojo;
 
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class User {
    private Integer id;
    private String name;
    private String[] strs;
    private List<String> list;
    private Set<String> set;
    private Map<String, String> map;
    private Properties properties;
 
    // 保留無參的構造方法
    public User() {
 
    }
 
    // 爲了演示使用帶參數構造的方式實現依賴注入所以提供一個帶參的構造方法測試
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
 
    // 下面的setter方法是測試使用setter方式依賴注入使用的
    public String[] getStrs() {
        return strs;
    }
 
    public void setStrs(String[] strs) {
        this.strs = strs;
    }
 
    public List<String> getList() {
        return list;
    }
 
    public void setList(List<String> list) {
        this.list = list;
    }
 
    public Set<String> getSet() {
        return set;
    }
 
    public void setSet(Set<String> set) {
        this.set = set;
    }
 
    public Map<String, String> getMap() {
        return map;
    }
 
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
 
    public Properties getProperties() {
        return properties;
    }
 
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", strs=" + Arrays.toString(strs) + ", list=" + list + ", set="
                + set + ", map=" + map + ", properties=" + properties + "]";
    }
 
}

testA()測試結果:


testB()測試結果:

以上兩種方式以及完成了依賴注入

接下來是名稱空間注入:

只是在配置文件有所不同,其他用法和以上的方法一致:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
   xmlns:user="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  
    <!-- 命名空間創建對象 -->  
   <bean id="user" class="cn.sz.pojo.User" user:uid="101" user:name="李四"></bean>  
</beans>


注:需要使用setter/getter方法
xmlns:user="http://www.springframework.org/schema/p"
user爲任意的名稱
<bean id="user" class="cn.sz.pojo.User" user:uid="101" user:name="李四"></bean>
bean中user是上面配置的user,名稱一致
--------------------- 
作者:benxiaohai888 
來源:CSDN 
原文:https://blog.csdn.net/benxiaohai888/article/details/78369091 

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