1. 程式人生 > 實用技巧 >Spring IOC控制反轉

Spring IOC控制反轉

三、控制反轉

通過設定一個第三方的容器,讓ABCD解耦,他們之間就不會因為某一個奔潰導致全部不能使用,他們實現了獨立;

控制反轉(Inversion of Control,縮寫為IoC),是面向物件程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查詢”(Dependency Lookup)。通過控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體將其所依賴的物件的引用傳遞給它。也可以說,依賴被注入到物件中。

簡單一點來說就是把這個程式的主動權進行一個移交;原來的程式,使用者獲得的物件是由程式設計師的class a=new class();來構成,如果使用者需求改變那麼物件就要改變但是如果使用setter注入的話,就不會存在這個問題;使用者需要什麼就自己選擇,程式設計師也避免了大量的程式碼修改工作;

四、IOC建立物件的三種方式(構造器注入)

預設使用的是無參構造器但是當有參構造器存在時,無參構造器便沒有用

1.第一種:下標

屬性是物件:

構造器:

public UserServiceImpl (UserDao userdao) {
        this.userDao=userdao;
    }
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg index="0" ref="OralceUserImpl"/>
    </bean>

屬性不是物件:

構造器:

public UserServiceImpl (int a) {
        System.out.println (a);
    }
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg index="0" value="0"/>
</bean>

index指的是構造器屬性的下標,如果不是物件就用value直接賦值;

2.第二種:根據屬性的型別(不推薦)

public UserServiceImpl (int a,String b) {
        System.out.println (a+"&"+b);
}
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg type="int" value="0"/>
        <constructor-arg type="java.lang.String" value="1"/>
    </bean>
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg type="com.saxon.Dao.UserDao" ref="OralceUserImpl"/>
</bean>

當存在多個相同資料的時候賦值根據你的語句順序來賦值;

不推薦原因:當我們的類名過於複雜的時候,就很容易把類名寫錯;當存在多個引數名一樣,但是類名不一樣的過載,無法確定使用那個

3.第三種:根據屬性的名字

public UserServiceImpl (UserDao userDao) {
        this.userDao = userDao;
    }

 <bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg name="userDao" ref="OralceUserImpl"/>
</bean>

是物件就用ref,不是物件直接用value;

我們所有的bean在註冊的時候,就全部被例項化過了,所以我們直接取過來就可以使用,所以他只會例項化一個物件,不會再new一個,下面執行的結果是true

ApplicationContext context = new ClassPathXmlApplicationContext ("applicationContent.xml");
UserServiceImpl userServiceImpl = (UserServiceImpl)context.getBean ("UserServiceImpl");
UserServiceImpl userServiceImp2 = (UserServiceImpl)context.getBean ("UserServiceImpl");
System.out.println (userServiceImpl==userServiceImp2);

ApplicationContext就是一個容器,你需要啥就拿啥;

自學總結
學習地址:狂神說Java