你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。
死鬼~看完記得給我來個三連哦!java
「本文主要介紹
Spring 中 IOC的XML配置開發
若有須要,能夠參考
若有幫助,不忘 點贊 ❥web
一個典型的 Spring 項目須要建立一個或多個 Bean 配置文件, 這些配置文件用於在 Spring IOC 容器裏配置 Bean. Bean 的配置文件能夠放在 classpath 下, 也能夠放在其它目錄下.正則表達式
建立一個類:
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 管理:
數組
/**
* 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>
複製代碼
/**
* 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:當一個類中有兩個構造方法app
new Person("Cbuc",22,"男"):我想使用的是第二個構造方法給age賦值,可是卻進入到了第一個構造方法中,爲salary賦值.框架
解決: 按類型匹配入參this
場景2:當一個類中有個構造方法spa
bean注入屬性的時候沒有按照構造方法的順序注入3d
解決: 按索引匹配入參
元素標籤或 value 屬性
進行注入。字面值注入
的方式
把字面值包裹起來。<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>
複製代碼
場景: 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使用,外部不能引用!)
List
Map
Set與List用法一致
屬性集合
數組
byType
(根據類型自動裝配):
若 IOC 容器中有多個與目標 Bean 類型一致的 Bean. 在這種狀況下, Spring 將沒法斷定哪一個 Bean 最合適該屬性, 因此不能執行自動裝配.
byName
(根據名稱自動裝配):
必須將目標 Bean 的名稱和屬性名設置的徹底相同.
Constructor
(經過構造器自動裝配) : 不推薦使用子 Bean 從父 Bean 中繼承配置, 包括 Bean 的屬性配置
子 Bean 也能夠覆蓋從父 Bean 繼承過來的配置
父 Bean 能夠做爲配置模板
, 也能夠做爲 Bean 實例. 若只想把父 Bean 做爲模板, 能夠設置 的abstract
屬性爲 true, 這樣 Spring 將不會實例化這個 Bean
並非 元素裏的全部屬性都會被繼承. 好比: autowire
,abstract
等.
能夠忽略父 Bean 的 class 屬性, 讓子 Bean 指定本身的類, 而共享相同的屬性配置. 但此時 abstract 必須設爲 true
Spring 容許用戶經過 depends-on
屬性設定 Bean 前置依賴的Bean,前置依賴的 Bean 會在本 Bean 實例化以前建立好
若是前置依賴於多個 Bean,則能夠經過逗號,空格或的方式配置 Bean 的名稱
Spring 提供了一個 PropertyPlaceholderConfigurer
的 BeanFactory
後置處理器, 這個處理器容許用戶將 Bean 配置的部份內容外移到屬性文件中. 能夠在 Bean 配置文件裏使用形式爲 ${var}
的變量, PropertyPlaceholderConfigurer 從屬性文件里加載屬性, 並使用這些屬性來替換變量.
「
- 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
組件掃描(component scanning
): Spring 可以從 classpath 下自動掃描, 偵測和實例化具備特定註解的組件.
特定組件包括:
@Component: 基本註解, 標識了一個受 Spring 管理的組件
@Respository: 標識持久層組件
@Service: 標識服務層(業務層)組件
@Controller: 標識表現層組件
對於掃描到的組件, Spring 有默認的命名策略:
使用非限定類名, 第一個字母小寫.
在註解中經過 value 屬性值標識組件的名稱
當在組件類上使用了特定的註解以後, 還須要在 Spring 的配置文件中聲明 <context:component-scan>
base-package 屬性指定一個須要掃描的基類包,Spring 容器將會掃描這個基類包裏及其子包中的全部類.
當須要掃描多個包時, 可使用逗號分隔.
若是僅但願掃描特定的類而非基包下的全部類,可以使用 resource-pattern 屬性過濾特定的類,示例:
「今天的你多努力一點,明天的你就能少說一句求人的話!
好久好久以前,有個傳說,聽說:
看完不讚,都是壞蛋