1. 程式人生 > >Spring IOC&DI

Spring IOC&DI

ssp www. factor highlight 軟件 狀態 style AR 類對象

  傳統實例化對象存在的為題:傳統開發可以使用new對父接口進行實例化,這樣就造成了代碼的極大耦合性,為了解決這種耦合性,可以引入工廠設計模式,來負責創建子類對象,這樣,工廠類幫助開發者隱藏了所有實現子類,但是靜態工廠類不能為所有的接口服務,而且每增加一個子類就要修改工廠類,這樣太麻煩,可以采用反射機制的動態工廠類來解決,但是動態工廠類還是需要知道對象的類型才可以,而且需要考慮到多線程的問題。

對於以上開發存在的問題,Spring采用IOC&DI來實現

Spring開發需要引入下列依賴包:

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

IOC指的是控制反轉,將對象的管理交給Spring進行管理:

  在src/main/resources/spring目錄下創建Bean配置文件spring-base.xml技術分享圖片

,並且打開命名空間,裏面定義所有的Bean,交由Spring管理:<bean id="messageImpl(別名)" class="cn.lt.service.MessageImpl(子類)"/>

  對<bean>元素的解釋:1、每個Bean可以有一個id屬性,並可以根據該id在IoC容器中查找該Bean,該id屬性值必須在IoC容器中唯一,一般以對象類首字母小寫來定義;

             2、用來表示類的全名,通常為package.classname;

  在Spring中所有的容器都由ApplicationContext接口來描述(子類ClassPathXmlApplicationContext是spring讀取xml最常用的類。而我們一般操作的是她的接口ApplicationContext。),

  ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-base.xml") ;

  //Spring加載源文件夾目錄下的.xml文件

  Message msg = context.getBean("messageImpl",IMessage.class) ;

  //通過getBean("id",接口.class)方法從ApplicationContext容器中獲取裝配好的Bean實例以供使用。

Spring測試:

  DI指的是依賴註入,依賴是一種關系,在A類中創建B的實例,我們叫做A依賴於B;將B對象作為A的構造器參數進行傳入,在調用類A之前已經將B類實例化好了,這種方式叫依賴註入

  需要引入的依賴庫:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.7.RELEASE</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-annotations-api</artifactId>
      <version>9.0.8</version>
    </dependency>

引入測試依賴庫後,就不需要使用ApplicationContext中的getBean()方法來獲得bean對象了,而是使用ContextConfiguration(locations = {"classpath:spring/spring-base.xml"})來加載配置文件並裝載實例。並且使用@Resource註解進行接口對象註入,替代了getBean()方法;

技術分享圖片

【問題】ClassPathXmlApplicationContext("spring/spring-base.xml") 最後是被什麽替代的

【備註】耦合性:也稱塊間聯系。指軟件系統結構中各模塊間相互聯系緊密程度的一種度量。模塊之間聯系越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決於模塊間接口的復雜性、調用的方式及傳遞的信息

ApplicationContext是BeanFactory的子類,與BeanFactory不同的是,ApplicationContext容器實例化後會自動對所有的單實例Bean進行實例化與依賴關系的裝配,使之處於待用狀態。而BeanFactory容器實例化後並不會自動實例化Bean,只有當Bean被使用時BeanFactory容器才會對該Bean進行實例化與依賴關系的裝配

ApplicationContext有四個常用子類:1.ClassPathXmlApplicationContext(從類路徑ClassPath中尋找指定的XML配置文件,找到並裝載完成ApplicationContext的實例化工作)、2.FileSystemXmlApplicationContext(從指定的文件系統路徑中尋找指定的XML配置文件,找到並裝載完成ApplicationContext的實例化工作)、3.XmlWebApplicationContext(從Web應用中尋找指定的XML配置文件,找到並裝載完成ApplicationContext的實例化工作)。

Spring IOC&DI