1. 程式人生 > 實用技巧 >IoC思想的實現:依賴注入(一)

IoC思想的實現:依賴注入(一)

IoC介紹:

IoC是什麼?

IoC控制反轉(Inversion of control):是一種理論思想。其實就是把物件的建立、賦值和管理交給容器來實現。

為什麼要使用IoC?

1、為了使用較少的程式碼來實現相應的功能

2、解耦合。

IoC的技術實現——依賴注入:在程式中,我們只需要使用物件的名稱就可以了,至於物件的建立、賦值都不需要我們管。spring中實現DI(依賴注入)的方式主要有兩種:

1、使用XML的方式來實現

2、使用註解的方式

首先:使用XML的方式進行依賴注入

步驟:

1、加spring依賴

2、建立類檔案

public class Student {
    
private String name; private int age; public void setName(String name) { System.out.println("name: "+name); this.name = name; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { System.out.println(
"age:"+age); this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

3、建立spring的xml配置檔案。

<!--
        簡單型別:spring中規定java的基本資料類行和字串都是簡單型別。
        第一種給物件賦值,set注入也叫設值注入:spring呼叫類的set方法,在set方法中對物件的屬性進行賦值。
        1、簡單型別的set注入
            <bean id = "" class= "">
                <property name = "屬性的名字" value = "此屬性的值"/>
                一個property只能給一個屬性賦值。
            </bean>
            設值注入先使用不帶引數的構造方法,然後呼叫set方法。有set方法就可以執行。
            xml的規則是值必須放在引號之中。
    
--> <bean id="myStudent" class="com.kunkun.spring.ba01.Student"> <property name="name" value="lisi"></property> <property name="age" value="20"></property> </bean> <bean id="myDate" class="java.util.Date"> <property name="time" value="923230123"></property> </bean>

4、使用ApplicationContext介面getBean方法來獲取配置在bean標籤中的物件。

@Test
    public void test(){
        String config = "ba01/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        Student student = (Student) ac.getBean("myStudent");

        System.out.println(student.toString());
        Date date = (Date) ac.getBean("myDate");
        System.out.println(date);
    }

上面介紹的是使用set方法來建立物件(在類中必須要有相應的set方法)。我們同樣也可以使用構造放發來給屬性賦值:

只需要在上面的第三步中改成:

<bean id="myStudent" class="com.kunkun.spring.ba03.Student">
        <constructor-arg name="name" value="李四lisi"></constructor-arg>
        <constructor-arg name="age" value="12"></constructor-arg>
        <constructor-arg name="school" ref="school"></constructor-arg>
    </bean>
    <bean id="school" class="com.kunkun.spring.ba03.School">
        <property name="name" value="北京大學"></property>
        <property name="address" value="海淀區"></property>
    </bean>

上面的程式碼:其中標籤屬性ref表示引用型別的屬性賦值。ref的值為另一個bean的id。

引用型別的自動注入

兩個注入規則:byType和byName。

spring這個框架可以根據默寫規則給引用型別自動賦值。
使用的規則最常用的是byName和byType
1、byName:按名稱注入。java類中引用型別的屬性名,和bean中id的名稱一樣且資料型別是一致的,這樣的話,spring可以給屬性自動賦值。
語法:<bean id ="" class = "" autowire="byName">
簡單型別屬性賦值
</bean>

2、byType:按型別注入。java中資料類行和配置檔案中宣告的bean中的class屬性是同源關係,自動賦值。
同源的意思就是:
(1)、同一種類型
(2)、Java中是父類,bean是子類。
(3)、java中是介面,bean是介面的實現。
語法:<bean id ="" class = "" autowire="byType">
簡單型別屬性賦值
</bean>

1、byName:在bean標籤中加入一個autowire的標籤屬性來確定注入規則。其中school中的id必須和類中的屬性是相同的名字。

2、byType:spring容器會在容器中找到同源的物件(子類、實現類和同類)。如果物件重複,就會報錯。

多個配置檔案

優勢:每個配置檔案都不大,效率高,避免多人競爭一個配置檔案帶來的衝突。

上面的配置表示引入以Spring_開頭的所有檔案,和被註釋掉的程式碼一個意思。

關鍵字:classpath:表示類路徑,在IDEA中類路徑表示為tar/classes。