?? day2.txt
字號:
特殊的Bean裝配:
1、后處理Bean
接口:org.springframework.beans.factory.config.BeanPostProcessor
示例:所有Bean的字符串屬性改成大寫
練習:
Spring已經實現該接口的BeanPostProcessor(不用再注冊)
ApplicationContextAwareProcessor:
把應用上下文傳遞給所用實現了 ApplicationContextAware接口的Bean
ApplicationContextAware接口使用舉例,可參照事件監聽機制
DefaultAdvisorAutoProxyCreator
自動對Bean應用切面
2、Bean工廠后處理(只能在應用上下文中使用)
接口:org.springframework.beans.factory.config.BeanFactoryPostProcessor
示例:統計載入到工廠的Bean的個數
Spring內部接口實現:
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
分散配置(PPT42)
示例:
練習:
寫一個數據庫的配置
屬性編輯
org.springframework.beans.factory.config.CustomEditorConfigurer
示例:
練習:
CustomerInfo("fname-lname-address")
3、事件監聽
1)自定義事件,通過繼承org.springframework.context.ApplicationEvent
2)自定義監聽器,實現 org.springframework.context.ApplicationListener,并注冊
3)發布事件,為得到應用上下文,
必須實現org.springframework.context.ApplicationContextAware接口
示例:
練習:
AOP:
幾個概念:
(1)目標對象(target)
就是被代理的對象,也就是具體的業務邏輯。比如OrderService
(2)切面 (Aspect)
交叉業務,也就是通用的業務邏輯,比如日志、事務。
(3)連接點 (Jointpoint)
切面可以插入的地點,主要有方法、屬性
(4)切入點 (Pointcut)
指定哪些連接點可以應用切面/通知
(5)通知(Advice)
切面的具體實現
也可這樣理解:
advice是你想向別的程序內部不同的地方注入的代碼。
pointcut定義了需要注入advice的位置,通常是某個特定的類的一個 public方法。
advisor是pointcut和advice的裝配器,是將advice注入主程序中預定義位置的代碼
Advice:
切面的實現
類型:
(1)org.springframework.aop.MethodBeforeAdvice
在方法調用之前,做處理。
不能夠改變返回值
不能夠改變目標方法的流程,也不能中斷流程的處理過程(除非拋出異常)
(2)org.springframework.aop.AfterReturningAdvice
在方法調用之后,做處理。
不能夠改變返回值
不能夠改變目標方法的流程,也不能中斷流程的處理過程(除非拋出異常)
(3)org.aopalliance.intercept.MethodInterceptor
在方法調用之前以及之后,做處理。
可以改變返回值,也可以改變流程。
(4)org.springframework.aop.ThrowsAdvice
在方法拋出異常后,做處理。
當該通知處理完異常后,會簡單地將異常再次拋出給目標調用方法。
內置的創建代理類:
org.springframework.aop.framework.ProxyFactoryBean ppt55
proxyInterfaces,interceptorNames
配置過程:
(1)配置目標對象
(2)配置通知
(3)利用ProxyFactoryBean將通知織入到目標對象,形成一個動態代理對象
(4)客戶端使用動態代理來訪問目標對象的方法。
在默認情況下,通知會應用到所有的方法之上。
Pointcut: ppt48
根據方法和類決定在什么地方織入通知
Advisor
將Pointcut與Advice結合到一起。
自定義切入點:
步驟:
1)實現org.springframework.aop.ClassFilter
2)實現org.springframework.aop.MethodMatcher
3)實現org.springframework.aop.Pointcut
4)實現org.springframework.aop.PointcutAdvisor
注意:
在此可定義
private Advice advice;
private Pointcut pointcut;
在配置文件中,將自定義的切入點與通知綁訂到一起
5)利用ProxyFactoryBean將advisor織入到目標對象
預定義切入點:
靜態切入點:
org.springframework.aop.support.NameMatchMethodPointcutAdvisor
根據方法名稱的特點進行匹配,不考慮目標對象
mappedName(要匹配的方法的名稱),
mappedNames:對個方法進行匹配
advice(ref):要配置的通知
org.springframework.aop.support.RegexpMethodPointcutAdvisor
根據正則表達式來匹配
pattern,advice(ref)
正則表達式:用來匹配字符串的模式
. : 匹配任意單個字符
+ : 匹配前一個字符一次或多次
* : 匹配前一個字符0次或多次
動態切入點:
org.springframework.aop.support.ControlFlowPointcut
切入點的交叉與合并:
Pointcuts.union
Introduction
一種特殊類型的Advice
為類動態增加方法和屬性
編程步驟:
1)實現org.springframework.aop.IntroductionInterceptor或
繼承org.springframework.aop.support.DelegatingIntroductionInterceptor
2)使用org.springframework.aop.support.DefaultIntroductionAdvisor
自動代理:
Spring在生成代理對象的時候,默認情況下,會使用被代理對象的接口來生成
代理對象。
如果被代理對象沒有實現接口,此時,Spring會使用CGLIB生成代理對象,此時
該代理對象是被代理對象的子類。
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator
根據類的名稱來為符合相應名稱的類生成相應代理對象。
beanNames(list),interceptorNames
org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
自動將Advisor與匹配的Bean進行綁定
只能與Advisor配合使用
練習:
檢測方法執行時間
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -