Spring Expression Language,Spring表達式語言,簡稱SpEL。支援運作時查詢并可以操作對象圖。
和JSP頁面上的EL表達式、Struts2中用到的OGNL表達式一樣,SpEL根據JavaBean風格的getXxx()、setXxx()方法定義的屬性通路對象圖,完全符合我們熟悉的操作習慣。
SpEL使用#{…}作為定界符,所有在大框号中的字元都将被認為是SpEL表達式。
整數:<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:<property name="enabled" value="#{false}"/>
引用其他bean
引用其他bean的屬性值作為自己某個屬性的值:
調用靜态方法
調用非靜态方法
①普通元件:@Component
辨別一個受Spring IOC容器管理的元件
②持久化層元件:@Respository
辨別一個受Spring IOC容器管理的持久化層元件
③業務邏輯層元件:@Service
辨別一個受Spring IOC容器管理的業務邏輯層元件
④表述層控制器元件:@Controller
辨別一個受Spring IOC容器管理的表述層控制器元件
⑤元件命名規則
[1]預設情況:使用元件的簡單類名首字母小寫後得到的字元串作為bean的id
[2]使用元件注解的value屬性指定bean的id
注意:事實上Spring并沒有能力識别一個元件到底是不是它所标記的類型,即使将@Respository注解用在一個表述層控制器元件上面也不會産生任何錯誤,是以@Respository、@Service、@Controller這幾個注解僅僅是為了讓開發人員自己明确目前的元件扮演的角色。
掃描元件:
[1]base-package屬性指定一個需要掃描的基類包,Spring容器将會掃描這個基類包及其子包中的所有類。
[2]當需要掃描多個包時可以使用逗号分隔。
[3]如果僅希望掃描特定的類而非基包下的所有類,可使用resource-pattern屬性過濾特定的類,示例:
<context:include-filter>子節點表示要包含的目标類
注意:通常需要與use-default-filters屬性配合使用才能夠達到“僅包含某些元件”這樣的效果。即:通過将use-default-filters屬性設定為false,禁用預設過濾器,然後掃描的就隻是include-filter中的規則指定的元件了。
<context:exclude-filter>子節點表示要排除在外的目标類
component-scan下可以擁有若幹個include-filter和exclude-filter子節點

JAR包
必須在原有JAR包組合的基礎上再導入一個:spring-aop-4.0.0.RELEASE.jar
Controller元件中往往需要用到Service元件的執行個體,Service元件中往往需要用到Repository元件的執行個體。Spring可以通過注解的方式幫我們實作屬性的裝配。
②實作依據在指定要掃描的包時,<context:component-scan> 元素會自動注冊一個bean的後置處理器:AutowiredAnnotationBeanPostProcessor的執行個體。該後置處理器可以自動裝配标記了@Autowired、@Resource或@Inject注解的屬性。
③@Autowired注解
[1]根據類型實作自動裝配。
[2]構造器、普通字段(即使是非public)、一切具有參數的方法都可以應用@Autowired注解
[3]預設情況下,所有使用@Autowired注解的屬性都需要被設定。當Spring找不到比對的bean裝配屬性時,會抛出異常。
[4]若某一屬性允許不被設定,可以設定@Autowired注解的required屬性為 false
[5]預設情況下,當IOC容器裡存在多個類型相容的bean時,Spring會嘗試比對bean的id值是否與變量名相同,如果相同則進行裝配。如果bean的id值不相同,通過類型的自動裝配将無法工作。此時可以在@Qualifier注解裡提供bean的名稱。Spring甚至允許在方法的形參上标注@Qualifiter注解以指定注入bean的名稱。
[6]@Autowired注解也可以應用在數組類型的屬性上,此時Spring将會把所有比對的bean進行自動裝配。
[7]@Autowired注解也可以應用在集合屬性上,此時Spring讀取該集合的類型資訊,然後自動裝配所有與之相容的bean。
[8]@Autowired注解用在java.util.Map上時,若該Map的鍵值為String,那麼 Spring将自動裝配與值類型相容的bean作為值,并以bean的id值作為鍵。
④@Resource
@Resource注解要求提供一個bean名稱的屬性,若該屬性為空,則自動采用标注處的變量或方法名作為bean的名稱。
⑤@Inject
@Inject和@Autowired注解一樣也是按類型注入比對的bean,但沒有reqired屬性。
配置檔案:
測試代碼: