程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring學習點滴,《Spring in Action》筆記(一)

Spring學習點滴,《Spring in Action》筆記(一)

編輯:關於JAVA

第二章:裝配 Bean

--------------------------------------------------------------------------------

1. <ref>標簽中的 bean, local, parent 三個屬性的區別(P53)

2. <list><value...</list>和<set><value...</set>可以換著用都 可以為 List, Set 以及數組屬性賦值(P55)

3. <map>屬性用 spring 進行裝匹時 key 值只能是字符串類型,不過一般能滿足要求(P55)

4. 裝配 map 屬性要用 <entry key="key1"><value>foo</value></entry>, 而裝匹 properties 屬性可以寫成 <prop key="key1">foo</prop>, 這是因為 properties 的值總是字符串,而 map 中很隨意 (P55)

5. 用 <property name="foo"><null/></property> 形式設置屬性為 null, 區別 為字符串 "null"(P56)

6. 通過構造函數注入依賴時,對多參數需要借助於 index 或 type 屬性來指定對應哪個參數,index 屬性能應付所有情況(P58)

7. 可為 bean 設置 autowire為四個值, byName, byType, constructor, autodetect, 四種方式自 動裝匹;也可以在 <beans> 中設置 default-autowire 屬性。手動和自動可以混合使用,手動優 先。你應該清楚自己在做什麼,所以不建議用自動裝配(P61)

8. BeanPostProcessor的方法 postProcessBeforeInitialization 在 bean 初始化之前調用, postProcessAfterInitialization 是在 bean 初始化之後調用,需要注冊到 BeanFactory 上,如 factory.addBeanPostProcessor(new BeanPostProcessor(){...})。內置的 ApplicationContextAwareProcessor 注冊在了 AbstractApplicationContext 上了(P64)

9. BeanFactoryPostProcessor 是在 Bean 工廠載入所有 Bean 定義後,實例化 Bean 之前作處理。 如果是 AbstractApplicationContext ,那麼只需要配置 <bean id="myBeanFactoryPostProcessor" class="com.unmi.MyBeanFactoryPostProcessor"/>, 則會自動注冊這個,原有的 BeanFactoryPostProcessor 不可用了,不需要顯示式的調用 addBeanFactoryPostProcessor 方法(P67)

10. 可用 PropertyPlaceholderConfigurer 載入屬性文件,然後在其他引用 value 的地方用 ${database.url} 的方式引用(P70)

11. 用 CustomEditorConfigurer 注冊自己的 PropertyEditorSupport 關聯特定的 bean 屬性的處理 ,可了解 Spring 有哪些內置的 PropertyEditorSupport(P72)

12. Spring 用 ResourceBundleMessageSource 處理國際化,配置成

  <bean id="messageSource" 

class="org.springframework.context.support.ResourceBundleMessageSource">
   <property name="basename">
   <value>trainingtext</value>
   </property>
  </bean>
  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
   <property name="basename">
   <value>trainingtext</value>
   </property>
  </bean>

會讀取 trainingtext.prperties, trainingtext_en_US.properties 等。

用 Sring text = context.getMessage("button.submit", new Object[0],locale); 或 <sping:message code="button.submit"/> 讀取(P73)

13. 監聽事件,配置實現了ApplicationListener的Bean,容器會自動注冊它,發布ApplicationEvent 時由它處理,事件的處理是同步的(P74)

14. Bean 實現了 BeanNameAware, BeanFactoryAware 或 ApplicationContextAware 可以感知它自己 或所處環境的信息,但這樣做卻讓 Bean 與 Spring 框架耦合起來了(P76)

第三章:創建切面

--------------------------------------------------------------------------------

15. AOP: spring 有兩種代理創建方式,對接口方法用JDK的java.lang.reflect.Proxy類創建代理, 對於未實現接口的借助於 CGLIB 庫生成目標對象的子類,標記為 final 的方法不能被通知,因為子類中 不能覆寫該方法(P83)

16. Spring 只支持方法連接點,應該也是秉著夠用就行的道理,直接用 AspectJ 將能做十分細致的 活,Spring 2.x 用上了 AspectJ。(P84)

17. MyEclipse 提供了一種快捷方式來寫Bean的配置,從左樹上把類拖到打開的 Spring 的配置文件 中依提示行事即可,實際使用中看是否真正實用

18. 在 MethodBeforeAdvice中可以拋異常(或System.exit(),這有點過份了) 阻止目標方法的執行 ,如果此時拋出的異常是 RuntimeException 或者目標方法申明的異常,將會被 Spring 框架捕獲(P86)

19. MethodInterceptor 能控制目標方法是否真的被調用,用 methodInvocation.proceed() 調用目 標方法(P89)

20. MethodInterceptor 可以返回一個與目標方法不同的對象,但也必須是兼容的,否則出現 ClassCastException 異常(P89)

21. 實現接口 ThrowsAdvice 的類,必須至少有一個如下形式方法:

1)void afterThrowing(Throwable throwable)

2)void afterThrowing(Method method, Object[] args, Object target, Throwable throwable)

在 ThrowsAdvice 並沒有象 MethodBeforeAdvice, MethodAfterAdvice 和 MethodInterceptor 定義 了要實現的方法,只是一個不成文的約定,不知作者是如何考慮的,怕定義了兩個方法後實現類要實現兩 個方法(可能只需用到一個方法)而麻煩嗎?那至少可以弄一個 ThrowsAdviceAdapter 的東西,Spring 中還確實有這玩藝,但不是那麼回事。

這種 ThrowsAdvice 對實現類不成文的規定,讓在 IDE 中寫代碼不方便,也容易產生錯誤(P90)

22. 當你的 ThrowsAdvice 同時實現了上面兩個方法時,只有參數多的那個方法有效,只實現第一個 方法也是可以的,所以在 ThrowsAdvice 的源代碼中只提到要實現第二個方法,所以我就更想不能了,為 什麼在接口 ThrowsAdvice 中不定義這個方法呢?(P90)

23. 記錄幾個書中錯誤:54頁的java.awt應該是java.util。94頁的maidService配置中的 frequentCustomerAdvisor應該是 frequentCustomerPointcutAdvisor。108頁,後面兩個 proxyInterfaces 應該是 interceptorNames

24. 用 NameMatchMethodPointAdvisor 能簡單的用通配符控制切入點,但要細致的控制切入點就要用 RegexpMethodPointcutAdvisor 結合正則表達式了, 它可含有類名信息,而 NameMatchMethodPointAdvisor只需考慮方法名的匹配(P90)

25. 動態切入點的配置方法與靜態切入點略有不同,需要申明一個ControlFlowPointcut的Bean (Pointcut)作為DefaultPointcutAdvisor的pointcut屬性,然後這個advisor配置到ProxyFactoryBean的 interceptorNames,所以想,既然是叫做DefaultPointcutAdvisor,那麼是不是別的Pointcut也可以通過 這種方式來配置呢?動態切入點很損耗性能,非必要是不用,對JDK1.4會慢5位,對JDK1.3會慢10,對於 JDK1.5恐怕也好不到哪兒去(P96)

26. 覺得 Spring 的引用 IntroductionInterceptor 用起來特麻煩,遠沒有直接用 AspectJ 來的方 便與簡練(P100)

27. 配置 ProxyFactoryBean 時不指定 proxyInterfaces 屬性,直接指定 target 為Class,則會用 CGLIB生成目標類的子類。即使指定的 proxyInterfaces 屬性,設置 ProxyTargetClass 屬性為 true, 也會用 CGLIB 生成目標類的子類,而不是用JDK的動態代理(P106)

28. 配置 ProxyFactoryBean 時可以把 target 目標對象配置為interceptorNames的最後一個屬性 (P108)

29. 強大的自動代理:BeanNameAutoProxyCreator 和 DefaultAdvisorAutoProxyCreator。 DefaultAdvisorAutoProxyCreator實現了 BeanPostProcessor 接口,它只能與 Advisor 配合使用,自動 的處理所有的 Advisor (P109)

30. 看到29條中的自動代理,讓我回想起可以為一批 Bean 批量的增加 toString() 方法,只是那些 bean 必須通過 getBean()得來才能看到效果

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved