最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring中的DI步驟詳解

 更新時間:2023年11月17日 11:25:33   作者:guoyp2126  
本文主要介紹了bean的裝配實現(xiàn)過程,通常對于簡單數(shù)據(jù)類型數(shù)據(jù)初始主要在獲得對象后,使用setter方法完成,所謂的裝配主要是復雜數(shù)據(jù)類型的依賴注入,感興趣的朋友一起看看吧

【知識要點】

  • 控制反轉(IOC)將對象的創(chuàng)建權限交給第三方模塊完成,第三方模塊需要將創(chuàng)建好的對象,以某種合適的方式交給引用對象去使用,這個過程稱為依賴注入(DI)。如:A對象如果需要使用B對象的方法,則A類依賴B類。
  • 對象裝配是在對象構造過程中,對其屬性進行初始化。對象的屬性分為簡單數(shù)據(jù)類型和復雜數(shù)據(jù)類型,簡單數(shù)據(jù)類型通常指String、List、map等由高級語言提供的數(shù)據(jù)類型,復雜數(shù)據(jù)類型用戶自定義數(shù)據(jù)類型或第三方的數(shù)據(jù)類型,對象的裝配主要指對復雜數(shù)據(jù)類型的依賴注入(DI)。

【實驗目的】

了解基于xml的裝配技術
熟悉基于注解的裝配技術
掌握使用注解符@Autowired和@Resource的使用

【實驗內容】

定義學生類(Student)、課程類(Course)、班主任(ClassTeacher),學生類Student中有姓名、課程集合和班主任三個屬性,對學生對象進行裝配。
基于xml的設值注入
基于xml的構造注入
基于注解的裝配
基于自動裝配

【實驗步驟】

一. 實驗環(huán)境搭建

  • 標準的spring控制臺程序spring-assemble-demo5
  • 在源代碼com.bjwl.service包中增加Student、Course、ClassTeacher三個類,具體代碼如下所示。
public class Student {  
    private String sname;  
    private Integer sage;  
    private List<Course> courses;  
    private Teacher classTeacher;  
}  
public class Course {  
    private String courseName;  
}  
public class Teacher {  
    private String tname;  
}

1. 基于xml的設值注入

  • 設置注入類中必須有對應的setter方法和無參構造函數(shù),對類Student中的代碼改造如下所示。
public class Student {  
    private String sname;  
    private Integer sage;  
    private List<Course> courses;  
    private Teacher classTeacher;  
    public void setSname(String sname) {  
        this.sname = sname;  
    }  
    public void setSage(Integer sage) {  
        this.sage = sage;  
    }  
    public void setCourses(List<Course> courses) {  
        this.courses = courses;  
    }  
    public void setClassTeacher(Teacher classTeacher) {  
        this.classTeacher = classTeacher;  
    }  
   @Override
    public String toString() {
        return "Student{" +
                "sname='" + sname + '\'' +
                ", sage=" + sage +
                ", courses=" + courses +
                ", classTeacher=" + classTeacher +
                '}';
    }
} 

類Course 和Teacher 按照上述代碼添加setter方法,在此不再贅述。

  • 2. 在resources目錄下添加spring配置文件spring-assemble-set.xml,代碼如下所示。
<beans>  
    <!--基于屬性注入(設置注入)的bean裝配-->  
    <bean id="teacher" class="com.bjwl.service.setter.Teacher">  
        <property name="tname" value="李老師"></property>  
    </bean>  
    <bean id="student" class="com.bjwl.service.setter.Student">  
        <property name="sname" value="張三"></property>  
        <property name="sage" value="18"></property>  
        <property name="classTeacher" ref="teacher"></property>  
        <property name="courses">  
            <list value-type="com.bjwl.service.setter.Course">  
                <bean class="com.bjwl.service.setter.Course">  
                    <property name="courseName" value="數(shù)據(jù)結構"></property>  
                </bean>  
                <bean class="com.bjwl.service.setter.Course">  
                    <property name="courseName" value="數(shù)據(jù)庫原理"></property>  
                </bean>  
            </list>  
        </property>  
    </bean>  
</beans> 

在配置文件中property對應對象的屬性, value對應簡單數(shù)據(jù)類型的屬性值;當屬性值是由spring管理的對象時使用ref引用屬性值,當使用list、map等類型時,需要進一步描述數(shù)據(jù)類型等信息。

  • 編寫測試程序,在com.bjwl.service包中添加AssembleTest,定義測試方法,代碼如下所示。
public class AssembleTest {  
    @Test  
    public void setterTest(){  
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-assemble-set.xml");  
        Student student = (Student)context.getBean("student");  
        System.out.println(student.toString());  
    }  
}

運行測試程序,結果如下所示

2. 基于xml的構造注入

  • 1.使用構造注入裝配時,類中必須包含帶參構造函數(shù),學生類修改后代碼如下所示。
public class Student {  
    private String sname;  
    private Integer sage;  
    private List<Course> courses;  
    private Teacher classTeacher;  
    public Student(String sname, Integer sage, List<Course> courses, Teacher classTeacher) {  
        this.sname = sname;  
        this.sage = sage;  
        this.courses = courses;  
        this.classTeacher = classTeacher;  
    }  
    @Override  
    public String toString() {  
        return "Student{" +  
                "sname='" + sname + '\'' +  
                ", sage=" + sage +  
                ", courses=" + courses +  
                ", classTeacher=" + classTeacher +  
                '}';  
    }  
}

類Course 和Teacher 按照上述代碼添加setter方法,在此不再贅述。

  • 2. 在resources目錄下添加spring配置文件spring-constructor.xml,代碼如下所示。
<beans>  
    <bean id="teacher" class="com.bjwl.service.constructor.Teacher">  
        <constructor-arg index="0" value="張三"></constructor-arg>  
    </bean>  
    <bean id="student" class="com.bjwl.service.constructor.Student">  
        <constructor-arg index="0" value="張三"></constructor-arg>  
        <constructor-arg index="1" value="18"></constructor-arg>  
        <constructor-arg index="3" ref="teacher"></constructor-arg>  
        <constructor-arg  index="2">  
            <list value-type="com.bjwl.service.constructor.Course">  
                <bean class="com.bjwl.service.constructor.Course">  
                    <constructor-arg name="courseName" value="數(shù)據(jù)結構"></constructor-arg>  
                </bean>  
                <bean class="com.bjwl.service.constructor.Course">  
                    <constructor-arg name="courseName" value="數(shù)據(jù)庫原理"></constructor-arg>  
                </bean>  
            </list>  
        </constructor-arg >  
    </bean> 

代碼中constructor-arg標簽為構造注入標簽,constructor-arg中index是參數(shù)的索引,value對應簡單數(shù)據(jù)類型的屬性值;當屬性值是由spring管理的對象時使用ref引用屬性值。注意:在正式開發(fā)中通常使用constructor-arg標簽中使用name屬性,而不是index屬性,因為name對應構造函數(shù)的行參名,更加準確。

  • 3.在測類中增加constructorTest測試方法,代碼如下所示。
public class AssembleTest {  
    @Test  
    public void constructorTest(){  
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-constructor.xml");  
        Student student = context.getBean("student",Student.class);  
        System.out.println(student.toString());  
    }  
}  

運行測試程序,結果如下所示。

3. 基于注解的裝配

  • 1.基于注解的裝配,需要在代碼的屬性上使用注解符,Student的代碼修改如下所示。
@Component  
public class Student {  
    @Value("張三")  
    private String sname;  
    @Value("18")  
    private Integer sage;  
    @Value("#{courses}")  
    private List<Course> courses;  
    @Autowired  
    private Teacher classTeacher;  
}  
@Component  
public class Teacher {  
    @Value("李老師")  
    private String tname;  
}  
@Component  
public class Course {  
    public void setCourseName(String courseName) {  
        this.courseName = courseName;  
    }  
    private String courseName;  
} 

代碼中在類上添加的注解符@Component ,代表這個類創(chuàng)建的對象交給spring進行管理,在屬性上的@Value注解符,代表簡單數(shù)據(jù)類型屬性注入,@Autowired代表對象的注入。對于list、map的注入還要借助xml完成,如:課程集合的注入。

注意:對象注入時,使用@Autowired注解符是spring提供的,注入依據(jù)數(shù)據(jù)類型(byType),如:classTeacher屬性注入,是spring在對象池中尋找類型為Teacher的對象,然后進行匹配,如果系統(tǒng)中存在兩個或兩個以上類型為Teacher的對象,需要借助另外一個注解符@Qualifier完成;另外JDK還提供了一個注解符@Resource,也可以完成依賴注入,注入依據(jù)對象的名稱(byName),上例中需要在對象池中尋找名稱為classTeacher的對象進行注入。

  • 1.在resources目錄下添加spring配置文件spring-annotation.xml,代碼如下所示
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:context="http://www.springframework.org/schema/context"  
       xmlns:util="http://www.springframework.org/schema/util"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans.xsd   
       http://www.springframework.org/schema/context   
       https://www.springframework.org/schema/context/spring-context.xsd  
       http://www.springframework.org/schema/util   
       http://www.springframework.org/schema/util/spring-util.xsd">  
    <context:annotation-config />  
    <context:component-scan base-package="com.bjwl.service.annotation" />  
    <util:list id="courses">  
        <bean id="course1" class="com.bjwl.service.annotation.Course" >  
            <property name="courseName" value="數(shù)據(jù)結構"></property>  
        </bean>  
        <bean id="course2" class="com.bjwl.service.annotation.Course" >  
            <property name="courseName" value="數(shù)據(jù)庫原理"></property>  
        </bean>  
    </util:list>  
</beans> 

代碼的第3、7、8行引入context的頭部文件,第12行開啟注解注解Bean裝配,第13行聲明組件掃描位置

  • 3. 編寫測試程序,在測試類中增加AnnotationTest 方法,代碼如下所示。
    public void setterTest(){  
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-annotation.xml");  
        Student student = (Student)context.getBean("student");  
        System.out.println(student.toString());  
    }   

運行測試程序,測試結果如下

自動裝配技術

  • 1.使用自動裝配需要指定的屬性需要有setter方法。自動裝配技術可以依賴使用xml方式和注解方式對bean的管理,在此僅演示使用注解方式的自動裝配,簡單數(shù)據(jù)類型使用注解的方式完成,主要演示班主任(classTeacher)的注入,修改student類,代碼如下所示。
public class Student {  
    @Value("李四")  
    private String sname;  
    @Value("18")  
    private Integer sage;  
    private Teacher classTeacher;  
    public void setSname(String sname) {  
        this.sname = sname;  
    }  
    public void setSage(Integer sage) {  
        this.sage = sage;  
    }  
    public void setClassTeacher(Teacher classTeacher) {  
        this.classTeacher = classTeacher;  
    }  
    @Override  
    public String toString() {  
       //省略
    }  
}  
@Component("classTeacher")  
public class Teacher {  
    @Override  
    public String toString() {  
        //省略 
    }  
    @Value("zhangsan")  
    private String tname;  
} 

2.自動裝配依據(jù)配置文件中bean標簽的autowire屬性完成自動裝配規(guī)則的定義,在resources目錄下添加spring配置文件spring-auto.xml,配置文件代碼如下。

<beans xmlns="http://www.springframework.org/schema/beans"  
       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  
       https://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byName">  
       <context:annotation-config />  
       <context:component-scan base-package="com.bjwl.service.auto" />  
</beans>  

代碼第7行beans 指定default-autowire屬性的值為byName,通過屬性的名稱實現(xiàn)自動裝配,此時要求student的classTeacher屬性名必須 bean所對應的名稱完全一致,default-autowire屬性值也可以是為byType,通過屬性的類型實現(xiàn)自動裝配。此種裝配方式簡單,但是缺乏靈活度,開發(fā)時幾乎不用。

  • 3.編寫測試程序,在測試類中增加AutoTest 方法,代碼如下所示。
public class AutoTest {
    @Test
    public void  test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-auto.xml");
        Student student = context.getBean("student", Student.class);
        System.out.println(student.toString());
    }
}

運行測試程序,執(zhí)行結果如下圖所示

小結

本節(jié)主要介紹了bean的裝配實現(xiàn)過程,通常對于簡單數(shù)據(jù)類型數(shù)據(jù)初始主要在獲得對象后,使用setter方法完成,所謂的裝配主要是復雜數(shù)據(jù)類型的依賴注入。Bean的裝配可以基于xml配置、注解、自動化裝配三種方式,當前主流的使用基于注解的裝配,基于xml配置輔助,自動化裝配技術幾乎不用。在基于注解的配置中,特別注意注解符@Autowired和@Resource匹配規(guī)則及使用byType時,@Qualifier使用場景和原因。

到此這篇關于spring中的DI步驟詳解的文章就介紹到這了,更多相關spring中DI內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java利用多線程模擬銀行系統(tǒng)存錢問題

    Java利用多線程模擬銀行系統(tǒng)存錢問題

    本文將利用Java多線程模擬銀行系統(tǒng)存錢問題:使用兩個不同的線程向同一個賬戶存錢。文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08
  • Java中接口的深入詳解

    Java中接口的深入詳解

    在Java語言中,接口由類來實現(xiàn)以便使用接口中的方法,這篇文章主要給大家介紹了關于Java中接口的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • Java URL自定義私有網絡協(xié)議

    Java URL自定義私有網絡協(xié)議

    URI與URL的區(qū)別 一.先來序言一段 二.協(xié)議的自定義的理解 三.自定義協(xié)議與URL的關系 四.URL自定義私有協(xié)議實戰(zhàn) 五.后話,自定義mineType解析器
    2016-04-04
  • Spring-Data-JPA整合MySQL和配置的方法

    Spring-Data-JPA整合MySQL和配置的方法

    這篇文章主要介紹了Spring Data JPA整合MySQL和配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 淺談緩沖字符流 BufferedReader BufferedWriter用法

    淺談緩沖字符流 BufferedReader BufferedWriter用法

    這篇文章主要介紹了緩沖字符流 BufferedReader BufferedWriter的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • MyBatis?Plus?導入IdType失敗的解決

    MyBatis?Plus?導入IdType失敗的解決

    這篇文章主要介紹了MyBatis?Plus?導入IdType失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 如何使用Java在excel單元格中設置超鏈接

    如何使用Java在excel單元格中設置超鏈接

    這篇文章主要介紹了如何使用Java在excel單元格中設置超鏈接,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 解決Java中由于數(shù)據(jù)太大自動轉換成科學計數(shù)法的問題

    解決Java中由于數(shù)據(jù)太大自動轉換成科學計數(shù)法的問題

    今天小編就為大家分享一篇解決Java中由于數(shù)據(jù)太大自動轉換成科學計數(shù)法的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • openfeign使用nacos服務注冊方式調用的實現(xiàn)

    openfeign使用nacos服務注冊方式調用的實現(xiàn)

    文章說明如何將項目注冊到Nacos,使OpenFeign調用時通過服務名自動發(fā)現(xiàn)服務,無需手動配置URL,需添加Nacos和Sentinel依賴,啟動類使用@FeignClient注解并指定fallback,服務名稱直接填入value屬性即可實現(xiàn)動態(tài)調用
    2025-09-09
  • mybatis?collection和association的區(qū)別解析

    mybatis?collection和association的區(qū)別解析

    這篇文章主要介紹了mybatis?collection解析以及和association的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論

清水河县| 民勤县| 广汉市| 枣阳市| 阳春市| 漳浦县| 南通市| 襄垣县| 合江县| 施秉县| 县级市| 西城区| 咸丰县| 崇阳县| 黄山市| 绿春县| 宁远县| 南平市| 盐城市| 临安市| 涪陵区| 湘西| 普兰店市| 永福县| 宁海县| 博乐市| 莎车县| 闻喜县| 灵宝市| 花莲县| 淅川县| 靖西县| 郧西县| 洛隆县| 石阡县| 宁蒗| 五原县| 卢龙县| 江山市| 宁远县| 易门县|