1. 程式人生 > >spring IOC控制反轉和DI依賴註入

spring IOC控制反轉和DI依賴註入

req 記錄 run it is direct 模式 eve you target

spring framework 的doc地址:https://docs.spring.io/spring/docs/current/spring-framework-reference/

spring framework 作為一個優秀的開源框架,其高擴展和高可用性毋庸置疑。這篇文章記錄spring framework的控制反轉。

  1.什麽叫控制反轉:在系統開發中我們要創建一個實例常見的做法就是new 一個對象(當然也還有其他創建實例的方法,eg 反射,工廠模式),這種通過程序員手動創建實例的行為稱為正控制。spring的控制反轉就是讓程序員做的工作交給spring容器來處理。創建實例交給spring容器。這就叫控制反轉。

  2.IOC (全程inversion of Control)和 DI(Dependency injection ) :別看這是兩個名稱,一個控制反轉,一個依賴註入。spring 的官網這樣描述:

    This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) [1] principle. IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean. This process is fundamentally the inverse, hence the name Inversion of Control (IoC), of the bean itself controlling the instantiation or location of its dependencies by using direct construction of classes, or a mechanism such as the Service Locator pattern.

    IOC也被稱為DI,他是一個對象定義其屬性關系的過程。我們傳入需要構造的實例的名稱,屬性 給spring的對象工廠,工廠方法將會去創建這個bean實例,創建的過程就是依賴傳入的屬性。程序員做的事情就是聲明一些屬性,創建實例就交給spring容器。spring 容器使用了工廠模式(建議看看設計模式之禪),程序員輸入原料,spring生產出產品。

  3.spring的IOC容器做了什麽?IOC容器對bean進行實例化,組裝和管理。實例化自然不用說,組裝是將bean和其他的bean建立依賴關系,比如一個Car 類 ,裏面包含了Engin (發動機)類,Tyre(輪胎)類等,這是其他的類和這個類是有依賴關系的。管理:管理的是bean的作用範圍和生命周期,默認的bean是無狀態的bean,還有request、session、application、prototype等。

  4.配置bean被spring托管的形式有三種:一種是在xml配置,一種是註釋,還有一種是properties文件(幾乎沒用過)。

  5.在應用中實例化bean容器的方式的方式:ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext ,這兩個的構造函數只用傳入xml配置路徑(當然還有其他的構造函數)

  6.重點:bean的生命周期分為多種,這裏講一個場景:單例(bean-singleton)裏面註入多例原型(bean-prototype):單例在容器初始化的時候就會被生成,僅僅只會生成一次,當將將多例原型註入單例的時候,多例也會在單例被實例化的時候實例化,當訪問這個單例的時候,多例將不會成為有狀態的bean,他跟隨單例成為無狀態的bean。這個很容易理解,不管是單例還是多例都只被實例化一次,表現出來的就是單例的行為。

   官網:However, suppose you want the singleton-scoped bean to acquire a new instance of the prototype-scoped bean repeatedly at runtime. You cannot dependency-inject a prototype-scoped bean into your singleton bean, because that injection occurs onlyonce, when the Spring container is instantiating the singleton bean and resolving and injecting its dependencies. If you need a new instance of a prototype bean at runtime more than once, see Method injection

  如果你是確實要這樣做:spring 提供了如下實現

技術分享圖片

本文講了spring的ioc和di的概念,以及bean的定義,後面文章會具體講bean怎麽被實例化。

spring IOC控制反轉和DI依賴註入