Spring學習筆記--IoC

IoC && DI

  • IoC:Inversion of Control(控制反轉)
  • DI:Dependency Injection(依賴注入)

IoC容器

ApplicationContext && BeanFactory

  • ApplicationContext是BeanFactory的子接口,在實例化上下文時就實例化所有單例的bean
  • ConfigurableApplicationContext是ApplicationContext的子類,新增了refresh()和close()方法。
  • ApplicationContext的兩個實現子類:
    ClassPathXmlApplicationContext :從類路徑下尋找文件
    FileSystemXmlApplicationContext:從文件系統中加載文件
    WebApplicationContext:從web的根目錄下完成初始化工作
  • getBean()方法:參數爲Class時要保證配置文件中bean唯一

配置Bean-基於xml方式

xml中通過 bean 節點配置 bean

  • id屬性:唯一標識
  • class屬性:全類名

依賴注入的三種方式

  • 屬性注入(通過property節點注入)
    • name 對應的setter方法
    • ref 引用的其他bean
    • value 賦值(基本數據類型及其封裝類型,String類型,還有特殊字符時使用< ![CDATA[]]>)
  • 構造器注入(通過constructor-arg節點注入)
    • index 構造器參數列表中的順序(從0開始)
    • type 構造器中參數的類型
  • 工廠方法注入(很少使用)

注入屬性值細節

  • 注入null值 使用專用< null/>元素標籤爲Bean注入null值
  • 集合屬性 在 Spring中可以通過一組內置的 xml 標籤(例如: < list>, < set> 或 < map>) 來配置集合屬性
  • 集合標籤定義獨立的集合Bean 使用utility scheme定義集合
  • 使用p命名空間簡化xml配置

Bean的自動裝配

  • 自動裝配 Bean. 需要做的僅僅是在 < bean> 的 autowire 屬性裏指定自動裝配的模式。
  • byType(根據類型自動裝配): 若 IOC 容器中有多個與目標 Bean 類型一致的 Bean. 在這種情況下, Spring 將無法判定哪個 Bean 最合適該屬性, 所以不能執行自動裝配。
  • byName(根據名稱自動裝配): 必須將目標 Bean 的名稱和屬性名設置的完全相同。
  • constructor(通過構造器自動裝配): 當 Bean 中存在多個構造器時, 此種自動裝配方式將會很複雜. 不推薦使用

Bean之間的關係

  1. 繼承
    通過在bean中添加屬性parent指定繼承的父bean,也可以忽略父 bean 的 class 屬性, 此時 abstract屬性 必須設爲 true
  2. 依賴
    用戶通過 depends-on 屬性設定 Bean 前置依賴的Bean,前置依賴的 Bean 會在本 Bean 實例化之前創建好

Bean的作用域

在 Spring 中, 可以在 < bean> 元素的 scope 屬性裏設置 Bean 的作用域。

類別 說明
singleton 在Spring IoC容器中僅存在一個Bean實例
prototype 每次調用getBean()時返回新的Bean實例
request 每次HTTP請求時創建新的Bean實例,僅適用於WebApplicationContext環境
session 同一個HTTP Session共享同一個Bean,僅適用於WebApplicationContext環境

使用外部配置文件配置Bean

在beans中添加context命名空間
在配置文件中配置如下:

<context:property-placeholder
      location="classpath:db.properties" />

通過 ${var} 的獲取var同名變量的值。

Spring表達式語言:SpEL

SpEL 使用 #{…} 作爲定界符

這裏寫圖片描述
這裏寫圖片描述這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

IoC中Bean的生命週期

Bean的生命週期

配置Bean-基於註解方式

組件掃描:Spring能夠從classpath下自動掃描,偵測和實例化具有特定註解的組件。

  • 第一步:標識組件
    特定組件包括:
    1. @Component 基本標識,標識一個受Spring管理的組件
    2. @Respository 標識持久化層組件
    3. @Service 標識業務層組件
    4. @Controller 標識表現層組件
      Spring 有默認的命名策略: 使用非限定類名, 第一個字母小寫. 也可以在註解中通過 value 屬性值標識組件的名稱
  • 第二步:在配置文件中聲明< context:component-scan>
    • base-package 屬性指定一個需要掃描的基類包,Spring 容器將會掃描這個基類包裏及其子包中的所有類。
    • 當需要掃描多個包時, 可以使用逗號分隔
    • 如果僅希望掃描特定的類而非基包下的所有類,可使用 resource-pattern 屬性過濾特定的類。如respostory/.class 表示掃描respostory子包下的所有類
    • < context:include-filter> 子節點表示要包含的目標類,需要配置< use-default-filters=”true”>
    • < context:exclude-filter> 子節點表示要排除在外的目標類
    • -
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章