Spring探究筆記01:IOC控制反轉

相關代碼:GithubGiteephp

1、IOC概述

1.1 什麼是IOC

控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)java

1.2 爲何要使用IOC

在平常程序開發過程中,咱們推薦面向抽象編程,面向抽象編程會產生類的依賴,固然若是你夠強大能夠本身寫一個管理的容器,可是既然spring以及實現了,而且spring如此優秀,咱們僅僅須要學習spring框架即可。 當咱們有了一個管理對象的容器以後,類的產生過程也交給了容器,至於咱們本身的app則能夠不須要去關係這些對象的產生了。git

爲何要把類生產的過程交給容器:有利於作一些通用的代碼抽離,能夠類比一下 代理設計模式github

2、IOC的實現思路

  • 應用程序中提供類,提供依賴關係(屬性或者構造方法)
  • 把須要交給容器管理的對象經過配置信息告訴容器(xml、annotation,javaconfig)
  • 把各個類之間的依賴關係經過配置信息告訴容器

3、IOC的實現方法

3.1 3中配置方式(編程風格)

雖然下面即將說到3種配置方式,但原理上,SpringIOC只有2中注入方法:基於setter注入、基於構造器注入。而所謂的3種配置方式(編程風格)只是不一樣的配置手段罷了。spring

3.1.1 xml風格

  • setter注入基礎使用 目錄結構以下:

    主要業務代碼以下:

    能夠看到,執行效果:
    This is indexService function.
    This is injectedString: 445566ddeeff
    This is index dao
    複製代碼
  • 構造器注入基礎使用
    1. 調整spring.xml文件以下:
      <bean id="indexService" class="cn.zephyr.IndexServiceImpl" >
          <constructor-arg name="indexDao" ref="indexDao"/>
          <constructor-arg name="injectedString" value="112233aabbcc"/>
      </bean>
      <bean id="indexDao" class="cn.zephyr.IndexDao"/>
      複製代碼
    2. IndexServiceImpl添加全參、無參構造器的lombok註解
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class IndexServiceImpl implements IndexService {
          ...
      }
      複製代碼
    3. 能夠看到一樣的效果
  • 添加p命名空間實現setter注入
    1. spring.xml文件添加p命名空間的約束:
      <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
              ...
          </beans>
      </xml>
      複製代碼
    2. 調整spring.xml文件以下:
      <bean id="indexService" class="cn.zephyr.IndexServiceImpl" p:indexDao-ref="indexDao" p:injectedString="445566ddeeff"/>
      複製代碼
    3. 能夠看到一樣的效果
  • 添加c命名空間約束實現構造器注入:
    1. spring.xml文件添加p命名空間的約束:
      <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
              ...
          </beans>
      </xml>
      複製代碼
    2. 調整spring.xml文件以下:
      <bean id="indexService" class="cn.zephyr.IndexServiceImpl" c:indexDao-ref="indexDao" c:injectedString="445566ddeeff">/>
      複製代碼
    3. 能夠看到一樣的效果

3.1.2 註解風格

基於註解的方式能夠說是極大的減輕了配置工做,使得咱們可以更加專一於業務代碼編寫:編程

  1. 主要業務代碼以下,執行後能夠看到一樣的效果:

3.1.1 java config風格

基於java config的方式,我的以爲讓咱們從繁瑣的xml配置解放出來,使用java config能夠提升代碼可讀性,減小出錯: 主要業務代碼以下(再也不使用spring.xml,使用SpringConfig.java取代),執行後能夠看到一樣的效果:
設計模式

相關文章
相關標籤/搜索