學習總結(1)

1. 標籤中的 bean, local, parent 三個屬性的區別

2. <list><value...</list>和<set><value...</list>可以換着用都可以爲 List, Set 以及數組屬性賦值

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

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

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

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

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

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

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

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

11. 用 CustomEditorConfigurer 註冊自己的 PropertyEditorSupport 關聯特定的 bean 屬性的處理,可瞭解 Spring 有哪些內置的 PropertyEditorSupport

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

<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"/> 讀取


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

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

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

16. Spring 只支持方法連接點,應該也是秉着夠用就行的道理,直接用 AspectJ 將能做十分細緻的活

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

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


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

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

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 中寫代碼不方便,也容易產生錯誤

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


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

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

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

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

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

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

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

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

31. Spring 把數據訪問流程中的固定部分和可變部分分開,分別映射成兩截然不同的類,模板(Template)和回調(Callback),模板管事物控制、資源管理以及異常處理;回調實現特定於應用的部分--創建 statement、綁定參數、以及整理結果集。模板方法模式的優秀應用

32. JdbcTemplate template = new JdbcTemplate(myDataSource); 構造。 所有 Spring Dao 模板類是線程安全的,可以爲每一個 DAO 配置一個 JdbcTemplate 屬性,也可以讓 DAO 類繼承 JdbcDaoSupport,然後在 DAO 類中用 getJdbcTemplate() 獲取到 JdbcTemplate 進行數據庫操作。書中的做法是給每個 Dao 加一個 JdbcTemplate 屬性,記錄的日誌略有不同,實際中注意

33. JdbcTemplate 的 execute() 方法不可帶 sql 參數,而 update() 方法可以,還能指定每一字段的類型,保證了類型安全,130頁說 JdbcTemplate 提供了 execute(String sql, Object[] params) 是錯誤的


34. JdbcTemplate 類創建了 PreparedStatementCreator 和 PreparedStatementSetter, 批量更新時需要創建自己的 BatchPreparedStatementCreator 類:

BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter(){
public int getBatchSize(){ return persons.size();}
public void setValues(PreparedStatement ps, int index) throws SQLException{
Person person = (Person) persons.get(index);
ps.setInt(0,person.getId().intValue());

}
};

getJdbcTemplate().batchUpdate(sql,setter);
把傳入的List<Person>批量的進行數據庫相應操作

35. 用JdbcTemplate讀數據,可以用 JdbcTemplate.query(sql,params, rowCallbackHandler), 實現 RowCallbackHandler的 processRow(ResultSet rs) 組裝查詢到的一個對象。實現自己的 RowMapper把 ResultSet 中一條記錄映射成一個對象,用JdbcTemplate.query(sql, params, new MyRowMapper())能夠返回查詢整理後的對象列表,書中 133 頁的帶 RowMapperResultReader的query方法已經不存在了。由此可見,即使是隻返回一條記錄的查詢也可用帶 RowMapper的query方法,只需返回第一條記錄就行

36. JdbcTemplate的 queryForXXX可更快捷返回簡單的查詢值,如一個 count, 只返回一條記錄的一個字段的值

37. JdbcTemplate 調用存儲過程: jdbcTemplate.execute("{ARCHIVE_STUDENTS}", new CallableStatementCallback(){.....}); 看清了,就是要實現自己的 CallableStatementCallback的一個方法
public Object doInCallableStatement(CallableStatement cs){
cs.execute();
return null;
}

38. 不接使用 JdbcTemplate, 擴展 SqlUpdate 和 MappingSqlQuery的用法。擴展 DataFieldMaxValueIncrementer 取得自增鍵值,有三個方法 nextIntValue()、nextLongValue()、nextStringValue(),根據實際數據庫可以用不同的實現


39. Acegi 安全系統由4個主要組件:
1)安全攔截器:攔載下用戶,要求提求用戶名與口令
2)認證管理器:進行用戶名與口令的驗證
3)訪問決策管理器:進訪問資源進行授權
4)更多的安全限制檢驗


40. 認證管理器接口是 AuthenticationManager,它的實現在是 ProviderManager, providerManager 具體是委派給 AuthenticationProvider 去處理,AuthenticationProvider接口與 AuthenticationManager 接口有完全相同的方法

41. 337頁配置中的 <property name="authenticationDao"> 應該是 <property name="userDetailsService">,Acegi 的包名也由原來的 net.sf.acegisecurity 變成了 org.acegisecurity,跟個 hibernate3 似的

42. Spring提供了兩種與 Struts 集成的方式
1)讓你的Action繼承 ActionSupport
2) 讓 Spring 管理你的 action

43. 爲了讓 Struts 能訪問 Spring 管理的 Bean,必須在 struts-config.xml 中註冊 ContextLoaderPluIn,用的是 WebapplicationContext

44. ActionSupport 重載了 setServlet()方法,獲取bean的方式爲getWebApplicationContext().getBean()

45. 繼承 ActionSupport 讓 Struts與Spring 緊密耦合,而且 Action 還負責查找 Bean,這也違背了IoC原則

46. 使用委託 Action:Struts-config.xml 中每個path都指定type爲org.springframework.web.struts.DelegatingActionProxy,實際的Action實例由Spring來管理,它們之間用path<->name來映射,這種方式並不好看

47. 使用請求委託,只在Struts-config.xml中配置 DelegatingRequestProcess或DelegatingTilesRequestProcessor作爲控制器,其餘配置不變,如<action path="/listCourses" type="com.unmi.MyCoursesAction"/>其實type屬性是被所配置的controller忽略掉了,所以可省去type屬性�嬲腁ction也是由Spring來配置裝配,也是通過 path--name來對應

48. 感覺Spring與Struts的搭配總有些牽強,沒有一種更完美的方式

49. HibernateDaoSupport有getSession()和closeSessionIfNecessary(),可取得Session作更自由的操作


50. DaoSupport有以下實現類:CciDaoSupport, HibernateDaoSupport, JdbcDaoSupport, JdoDaoSupport, PersistenceBrokerDaoSupport, SqlMapClientDaoSupport, SqlMapDaoSupport, TopLinkDaoSupport,據此瞭解支持哪些類型DB操作

51. 要用聲明式事物,需要用到 TransactionProxyFactoryBean 來包括你的 Service 類。

52. 能夠簡單配置被代理的Service的 transactionAttributes 屬性聲明事物,如下對方法名稱爲addStudent(可能是多個重載方法)啓用事物

<property name="transactionAttributes">
<props>
<prop key="addStudent">
PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
</prop>
</props>
</property>

如果沒爲某個 service 方法配置事物,它是能自動提交的。


52. 配置屬性 transactionAttributeSource爲 MatchAlwaysTransactionAttributeSource 實例,將使 TransactionProxyFactoryBean 的目標類代理的方法都被執行在一個事務環境中了,默認爲 PROGAGATION_REQUIRED,ISOLATION_DEFAULT

53. 可配置 DefaultTransactionAttribute 給 MatchAlwaysTransactionAtributeSoure 的 transactionAttribute 屬性,改變 MatchAlwaysTransactionAtributeSoure 的默認事物屬性

54. 使用 NameMatchTransactionAttributeSource 可能實現像在 CMT 中那樣的事物屬性配置。可設定事物回滾規則:默認情況下,發生 Runtime 異常回滾;發生checked exception 不回滾(這也是EJB的行爲),可定製,用正(+)或負(+)號寫在異常類名前,正異常表示事務仍可提交,負異常表示觸發回滾

55. NameMatchTransactionAttributeSource 應該能想像到,支持方法名的通配符形式,如 key="get*",應用到所有以get開始的方法

56. NameMatchTransactionAttributeSource 的簡潔配置,直接配置給 TransactionProxyFactoryBean 的 transactionProperties 屬性,形式如它的 properties 屬性配置,內部實現是會幫你構造 NameMatchTransactionAttributeSource 實例。在 Spring 1.2.8 中的 TransactionProxyFactoryBean 都沒有 transactionProperties �糶裕恢母靄奼鏡撓�

57. 可以用元數據來書寫事物屬性,JDK1.5 版以下需藉助於 Jakarta Commons Attributes,而且還需要結合 ANT 預編譯,麻煩,如果是JDK1.5以上就方便多了。要使用到 AttributesTransactionAttributeSource

58. 使用 Bean 繼承可以在父 bean (TransactionProxyFactoryBean)中定義公共的東西,如 transactionManager,transactionAttributeSource 等,子 bean 中只需要定義自己的 target 屬性,這樣做可以省卻很多 XML 配置。注意父 Bean 當抽象類使用,不需要用到它的實例,所以設置 lazy-init="true" 告訴容器不要初始化它


59. 更爲精彩的是自動代理的方式來總體配置各分散類中方法的事物屬性,結合使用 DefaultAdvisorAutoProxyCreator, TransactionAttributeSourceAdvisor 和 TransactionInterceptor (我還需要詳細理清楚)

60. 當使用自動代理時,MethodMapTransationAttributeSource 就能很多的派上用場了,它的 methodMap 屬性中可以指定哪個類的哪個方法,可以使用通配符
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章