夥計,是時候拉近你和【Spring】之間的距離了!

你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。
死鬼~看完記得給我來個三連哦!java

本文主要介紹 Spring 中 IOC的XML配置開發
若有須要,能夠參考
若有幫助,不忘 點贊web

什麼是Spring:

  • Spring 是一個開源框架
  • Spring 爲簡化企業級應用開發而生. 使用 Spring 可使簡單的 JavaBean 實現之前只有 EJB 才能實現的功能
  • Spring 是一個 IOC(DI) 和 AOP 容器框架.

具體描述:

  • 輕量級:Spring 是非侵入性的 - 基於 Spring 開發的應用中的對象能夠不依賴於 Spring 的 API
  • 依賴注入(DI --- dependency injection、IOC)
  • 面向切面編程(AOP --- aspect oriented programming)
  • 容器: Spring 是一個容器, 由於它包含而且管理應用對象的生命週期
  • 框架: Spring 實現了使用簡單的組件配置組合成一個複雜的應用. 在 Spring 中可使用 XML 和 Java 註解組合這些對象
  • 一站式:在 IOC 和 AOP 的基礎上能夠整合各類企業應用的開源框架和優秀的第三方類庫 (實際上 Spring 自身也提供了展示層的 SpringMVC 和 持久層的 Spring JDBC)

Spring 核心模塊:

IOC 和 DI

  • IOC(Inversion of Control):其思想是反轉資源獲取的方向. 傳統的資源查找方式要求組件向容器發起請求查找資源. 做爲迴應, 容器適時的返回資源. 而應用了 IOC 以後, 則是容器主動地將資源推送給它所管理的組件, 組件所要作的僅是選擇一種合適的方式來接受資源. 這種行爲也被稱爲查找的被動形式。
  • DI(Dependency Injection) — IOC 的另外一種表述方式:即組件以一些預先定義好的方式(例如: setter 方法)接受來自如容器的資源注入. 相對於 IOC 而言,這種表述更直接。

搭建 Spring 開發環境:

1)所需Jar包

2)Spring配置文件

一個典型的 Spring 項目須要建立一個或多個 Bean 配置文件, 這些配置文件用於在 Spring IOC 容器裏配置 Bean. Bean 的配置文件能夠放在 classpath 下, 也能夠放在其它目錄下.正則表達式

3)例子

  • 建立一個類:
public class Person {

    private String name;

    public Person() {
        System.out.println("Person's constructor...");
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
複製代碼
  • 傳統方式獲取這個類:編程

    Person person = new Person();
    person.setName("Cbuc");
    person.hello();
    複製代碼
  • 進行 Spring 管理:數組

    • 在beans.xml中注入bean:
  /** 
  * class: 經過全類名的方式配置Bean
  *    id:Bean的名稱; 
  *             - 在 IOC 容器中必須是唯一的;
  *             - 若 id 沒有指定,Spring 自動將權限定性類名做爲 Bean 的名字
  *             - id 能夠指定多個名字,名字之間可用逗號、分號、或空格分隔 
  * 依賴注入的方式
  *         1)屬性注入
  *         2)構造器注入
  *         3)工廠方法注入(不多使用,不推薦)
  */
  <!-- 經過 setter 方法注入屬性值 -->
  <bean id="person1" class="cbuc.life.test_01.Person">
      <!-- 爲屬性賦值 -->
      <!-- 經過屬性注入: 經過 setter 方法注入屬性值 -->
      <property name="name" value="Cbuc"></property>
  </bean>

  <!-- 經過構造器注入屬性值 -->
  <bean id="person2" class="cbuc.life.test_01.Person">
      <!-- 要求: 在 Bean 中必須有對應的構造器.  -->
      <constructor-arg value="Cbuc"></constructor-arg>
  </bean>
複製代碼
  • 完成注入後獲取Bean:
  /**
  *    1、在 Spring IOC 容器讀取 Bean 配置建立 Bean 實例以前, 必須對它進行實例化. 
  *    只有在容器實例化後, 才能夠從 IOC 容器裏獲取 Bean 實例並使用.
  *
  *    2、Spring 提供了兩種類型的 IOC 容器實現. 
  *            1)BeanFactory: IOC 容器的基本實現.是 Spring 框架的基礎設施,面向 Spring 自己;
  *            2)ApplicationContext: 提供了更多的高級特性. 是 BeanFactory 的子接口. 
  *              幾乎全部的應用場合都直接使用 ApplicationContext 而非底層的 BeanFactory
  */


  //1.  Spring 裝配 IOC
  ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
  //2. 經過 IOC 獲取 bean "person1"  經過指定ID的方式
  Person person = (Person) ctx.getBean("Person2");

  //經過指定類型的方式,弊端:若是IOC中配置了多個Person類,那麼將會不知道爲你注入那個Bean
  //Person perosn1 = ctx.getBean(Person.class);
複製代碼

小菜與你小結

1) 構造方法注入引入的問題

場景1:當一個類中有兩個構造方法app

new Person("Cbuc",22,"男"):我想使用的是第二個構造方法給age賦值,可是卻進入到了第一個構造方法中,爲salary賦值.框架


解決: 按類型匹配入參this


成功爲age賦值:

場景2:當一個類中有個構造方法spa

bean注入屬性的時候沒有按照構造方法的順序注入3d



那麼得到Bean的時候成功報錯

解決: 按索引匹配入參

2)字面值

  • 可用字符串表示的值,能夠經過 元素標籤或 value 屬性進行注入。
  • 基本數據類型及其封裝類、String 等類型均可以採起字面值注入的方式
  • 若字面值中包含特殊字符,可使用 把字面值包裹起來。
<bean id="person4" class="cbuc.life.test_01.Person">
    <property name="name">
        <!-- 若字面值中包含特殊字符, 則可使用 DCDATA 來進行賦值 -->
        <value><![CDATA[<Cbuc>]]></value>
    </property>
    <property name="age" value="22"></property>
    <property name="gender" value="1"></property>
</bean>
複製代碼

3)引用其它 Bean

場景: Person 中須要一個 Car 類


解決:

首先在IOC中注入Car:

<bean id="Mycar" class="cbuc.life.test_01.Car">
    <property name="maxSpeed" value="220"></property>
    <property name="price" value="200000"></property>
    <property name="brand" value="WEY"></property>
</bean>
複製代碼

方法一:經過 ref 在person中引用:


方法二: 內部Bean(注意內部Bean只能當前Bean使用,外部不能引用!)


4)設置級聯屬性


5)設置集合屬性

  • List


  • Map


  • Set與List用法一致

  • 屬性集合


  • 數組


6) p 命名空間的使用



7)自動裝配

  • byType(根據類型自動裝配):

    若 IOC 容器中有多個與目標 Bean 類型一致的 Bean. 在這種狀況下, Spring 將沒法斷定哪一個 Bean 最合適該屬性, 因此不能執行自動裝配.

  • byName(根據名稱自動裝配):

必須將目標 Bean 的名稱和屬性名設置的徹底相同.

  • Constructor(經過構造器自動裝配) : 不推薦使用

8)Bean中的繼承(parent

  • 子 Bean 從父 Bean 中繼承配置, 包括 Bean 的屬性配置

  • 子 Bean 也能夠覆蓋從父 Bean 繼承過來的配置

  • 父 Bean 能夠做爲配置模板, 也能夠做爲 Bean 實例. 若只想把父 Bean 做爲模板, 能夠設置 的abstract 屬性爲 true, 這樣 Spring 將不會實例化這個 Bean

  • 並非 元素裏的全部屬性都會被繼承. 好比: autowire,abstract 等.

  • 能夠忽略父 Bean 的 class 屬性, 讓子 Bean 指定本身的類, 而共享相同的屬性配置. 但此時 abstract 必須設爲 true

9)依賴 Bean 配置

  • Spring 容許用戶經過 depends-on 屬性設定 Bean 前置依賴的Bean,前置依賴的 Bean 會在本 Bean 實例化以前建立好

  • 若是前置依賴於多個 Bean,則能夠經過逗號,空格或的方式配置 Bean 的名稱

10)使用外部屬性文件

  • Spring 提供了一個 PropertyPlaceholderConfigurerBeanFactory 後置處理器, 這個處理器容許用戶將 Bean 配置的部份內容外移到屬性文件中. 能夠在 Bean 配置文件裏使用形式爲 ${var} 的變量, PropertyPlaceholderConfigurer 從屬性文件里加載屬性, 並使用這些屬性來替換變量.

11)Spring表達式語言(SpEL

  • Spring 表達式語言(簡稱SpEL):是一個支持運行時查詢和操做對象圖的強大的表達式語言。
  • 語法相似於 EL:SpEL 使用 #{…} 做爲定界符,全部在大框號中的字符都將被認爲是 SpEL
  • SpEL 爲 bean 的屬性進行動態賦值提供了便利

經過 SpEL 能夠實現:

  • 經過 bean 的 id 對 bean 進行引用

  • 調用方法以及引用對象中的屬性

  • 計算表達式的值

  • 正則表達式的匹配

  • 字面量的表示:

  • 整數:<property name="count" value="#{5}"/>

  • 小數:<property name="frequency" value="#{89.7}"/>

  • 科學計數法:<property name="capacity" value="#{1e4}"/>

  • String可使用單引號或者雙引號做爲字符串的定界符號:

    <property name="name" value="#{'Chuck'}"/>

    <property name='name' value='#{"Chuck"}'/>

  • Boolean

12)Bean 的生命週期

  1. 在Person類中自定義 Init 和 destroy 方法
  1. 在注入Bean的時候聲明兩個方法

13)在 classpath 中掃描組件

  • 組件掃描(component scanning): Spring 可以從 classpath 下自動掃描, 偵測和實例化具備特定註解的組件.

  • 特定組件包括:

  • @Component: 基本註解, 標識了一個受 Spring 管理的組件

  • @Respository: 標識持久層組件

  • @Service: 標識服務層(業務層)組件

  • @Controller: 標識表現層組件

  • 對於掃描到的組件, Spring 有默認的命名策略:

  • 使用非限定類名, 第一個字母小寫.

  • 在註解中經過 value 屬性值標識組件的名稱

  • 當在組件類上使用了特定的註解以後, 還須要在 Spring 的配置文件中聲明 <context:component-scan>

  • base-package 屬性指定一個須要掃描的基類包,Spring 容器將會掃描這個基類包裏及其子包中的全部類.

  • 當須要掃描多個包時, 可使用逗號分隔.

  • 若是僅但願掃描特定的類而非基包下的全部類,可以使用 resource-pattern 屬性過濾特定的類,示例:


看完不讚,都是壞蛋
看完不讚,都是壞蛋

今天的你多努力一點,明天的你就能少說一句求人的話!
好久好久以前,有個傳說,聽說:
看完不讚,都是壞蛋

相關文章
相關標籤/搜索