1. 程式人生 > 資訊 >贛深高鐵全線鋪通:設計時速 350 公里,今年底將開通運營

贛深高鐵全線鋪通:設計時速 350 公里,今年底將開通運營

IOC

我們之前的業務中,使用者的需求可能會影響我們原來程式碼,我們需要根據使用者的需求去修改原始碼,如果程式的程式碼量十分巨大,修改一次的成本代價十分昂貴!

原來:

private UserDao userDao=new UserDaoImpl();

我們使用一個set介面實現,已經發生了革命性的變化

private UserDao userDao;
//利用set進行動態實現值的注入
public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}
@Test
public void test(){
    UserService userService = new UserServiceImpl();
    // ((UserServiceImpl) userService).setUserDao(new UserDaoImpl());  可轉變多個實現類
    ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
    userService.getUser();
}
  • 之前,程式是主動建立物件,控制權在程式猿手上

  • 使用了set注入後,程式不在具有主動權,而是變成了被動的接受物件

    這種思想,從本質上解決了問題,我們程式猿不用再去管理物件的建立了。系統的耦合性大大降低,可以更加專注的在業務的實現上,這是IOC的原型

本質

控制反轉(IOC:Inversion of Control)不是什麼技術,而是一種設計思想

DI(依賴注入)是實現IOC的一種方法

也有人認為DI只是IOC的另一種說法,沒有IOC的程式中,我們使用面向物件程式設計,物件的建立與物件間的依賴關係完全硬編碼在程式中,物件的建立由程式自己控制,控制反轉後將物件的建立轉移給第三方,個人認為所謂的控制反轉就是:獲得依賴物件的方式反轉了

IoC是Spring框架的核心內容,使用多種方式完美的實現IoC,可以使用XML配置,也可以使用註解,新版本的Spring也可以零配置實現IoC。
Spring容器在初始化時先讀取配置檔案,根據配置檔案或元資料建立與組織物件存入容器中,程式使用時再從IoC容器中取出需要的物件。

控制反轉是一種通過描述(XML或者註解)並通過第三方去生產或獲取特定物件的方式。在Spring中實現控制反轉的是IOC容器,其實現方法就是依賴注入!

HelloSpring

新建一個pojo包,在包下建立一個Hello實體類

public class Hello {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Hello{" +
                "name='" + name + '\'' +
                '}';
    }
}

新增Spring配置檔案 beans.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
                           https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 使用Spring來建立物件 在Spring中這些都稱為Bean
        Hello hell = new Hello()
         bean = 物件  new Hello()
        id=變數名 hello
        class=new Hello()
        property 相當於給物件中的屬性設定一個值
        ref:引用Spring容器中建立好的物件id
        Values: 具體的值,基本資料型別和String
 -->
    <bean id="hello" class="com.dada.pojo.Hello">
        <property name="name" value="Spring"></property>
    </bean>
</beans>
  • id=變數名 hello
  • class=new Hello()
  • property 相當於給物件中的屬性設定一個值
  • ref:引用Spring容器中建立好的物件id
  • Values: 具體的值,基本資料型別和String

測試程式碼

@Test
public void test(){
    //獲取Spring的上下文物件
    ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
    //我們的物件現在都在Spring中管理了。我們要使用直接去裡面取出來就可以了
    Hello hello = (Hello) context.getBean("hello");
    System.out.println(hello);
}

Hello物件是誰建立的?

  • hello物件是由Spring建立的
    Hello物件的屬性是怎樣設定的?
  • 是由Spring容器設定的
    • 這個過程叫做控制反轉
    • 控制
      • 誰來控制物件的建立,傳統應用程式的物件是由程式本身控制建立的,使用Spring後,物件是由Spring來建立的。
    • 反轉
      • 程式本身不建立物件,而變成被動的接受物件。
    • 依賴注入
      • 就是利用set方法進行注入的
    • IoC是一種程式設計思想,有主動的程式設計變成被動的接收
    • IoC:物件由容器建立、管理和配置。