1.[spring aop]AOP核心概念
1、橫切關注點
對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之爲橫切關注點
2、切面(aspect)
類是對物體特徵的抽象,切面就是對橫切關注點的抽象
3、連接點(joinpoint)
被攔截到的點,因爲Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構造器
4、切入點(pointcut)
對連接點進行攔截的定義
5、通知(advice)
所謂通知指的就是指攔截到連接點之後要執行的代碼,通知分爲前置、後置、異常、最終、環繞通知五類
6、目標對象
代理的目標對象
7、織入(weave)
將切面應用到目標對象並導致代理對象創建的過程
8、引入(introduction)
在不修改代碼的前提下,引入可以在運行期爲類動態地添加一些方法或字段
2.[spring mvc]Spring AOP 支持編譯期織入、裝載期織入、運行時織入
AOP 實現的關鍵就在於 AOP 框架自動創建的 AOP 代理,AOP 代理則可分爲靜態代理和動態代理兩大類
靜態代理是指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱爲編譯時增強;
動態代理則運行時藉助於 JDK 動態代理、CGLIB 等在內存中“臨時”生成 AOP 動態代理類,因此也被稱爲運行時增強。
Spring對AOP的支持
1、如果目標對象實現了接口,默認會採用JDK的動態代理機制實現AOP
2、如果目標對象實現了接口,可以強制使用CGLIB實現AOP
3、如果目標對象沒有實現接口,必須使用CGLIB生成代理,spring會自動在CGLIB和JDK動態代理之間切換
3.spring的DispatcherServlet配置能有多個
<load-on-startup>1</load-on-startup> 要設置成不同的優先級。
以及
<servlet-mapping>
<servlet-name>weixin</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
應該不同。
4.自動裝配提供五種不同的模式供Spring容器用來自動裝配beans之間的依賴注入:
no:默認的方式是不進行自動裝配,通過手工設置ref 屬性來進行裝配bean。
byName:通過參數名自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置爲byName。之後容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
byType:通過參數的數據類型自動自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置爲byType。之後容器試圖匹配和裝配和該bean的屬性類型一樣的bean。如果有多個bean符合條件,則拋出錯誤。
constructor:這個同byType類似,不過是應用於構造函數的參數。如果在BeanFactory中不是恰好有一個bean與構造函數參數相同類型,則拋出一個嚴重的錯誤。
autodetect:如果有默認的構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。
5.【事務】Spring事務管理核心接口
6.Spring bean 的默認作用範圍singleton
7.集合注入
<bean id="collectionBean" class="com.tarena.entity.CollectionBean">
<!-- list 注入 -->
<property name="cityList">
<list>
<value>北京</value>
<value>上海</value>
<value>北京</value>
<value>廣州</value>
</list>
</property>
<!-- set注入 -->
<property name="citySet">
<set>
<value>北京</value>
<value>上海</value>
<value>北京</value>
<value>廣州</value>
</set>
</property>
<!-- 數組 注入 -->
<property name="cityArray">
<list>
<value>北京</value>
<value>上海</value>
<value>廣州</value>
<value>北京</value>
</list>
</property>
<!-- Map注入 -->
<property name="mms">
<map>
<entry key="1" value="如花"/>
<entry key="2" value="如來"/>
<entry key="3" value="如草"/>
</map>
</property>
<!-- Properties key=value -->
<property name="props">
<props>
<prop key="driverClassName">
com.mysql.jdbc.Driver
</prop>
<prop key="url">
jdbc:mysql://127.0.0.1:3306/mydb
</prop>
<prop key="username">root</prop>
<prop key="password">1234</prop>
</props>
</property>
</bean>
8.Spring 處理 XML 的編入編出(marshal/unmarshal)
Spring包裝了很多庫,包括 Jackson 和 JAXB
9.spring 緩存 @CachePut 和 @Cacheable
@CachePut:這個註釋可以確保方法被執行,同時方法的返回值也被記錄到緩存中。
@Cacheable:當重複使用相同參數調用方法的時候,方法本身不會被調用執行,即方法本身被略過了,取而代之的是方法的結果直接從緩存中找到並返回了。
@Cacheable的key生成方式 可以是方法參數及其成員變量的任意表達式
10.Spring 中 “@Transactional”註解是用 AOP 實現的
11.Spring框架支持如下五種不同的作用域:
singleton:在Spring IOC容器中僅存在一個Bean實例,Bean以單實例的方式存在。
request:每次HTTP請求都會創建一個新的Bean。該作用域僅適用於WebApplicationContext環境。
session:一個HTTP Session定義一個Bean。該作用域僅適用於WebApplicationContext環境.
globalSession:同一個全局HTTP Session定義一個Bean。該作用域同樣僅適用於WebApplicationContext環境.
bean默認的scope屬性是’singleton‘。
12.利用spring的mock類進行HTTP 請求單元測試:
spring框架提供了大量測試的mock類,包括與jndi,porlet,web應用相關的mock類。尤其是web應用相關的mock類,可以大大提高web組件測試的方便性。
打開spring的下載包的mock文件夾(路徑…mock\org\springframework\mock\web),就發覺有如下幾個文件:
MockHttpServletRequest:是HttpServletRequest接口的mock實現,用來模擬客戶端的HTTP請求,很常用的一個類。
MockHttpServletResponse:是HttpServletResponse接口的mock實現,用於模擬服務器對客戶端的響應。
MockHttpSession:是對HttpSession接口的mock實現。
DelegatingServletInputStream:是對ServletInputStream接口的mock實現。
DelegatingServletOutputStream:ServletOutputStream的mock實現。需要攔截和分析服務器的輸出的流的內容,可以使用該類。
其他的,例如MockFilterConfig,MockPageContext(可以測試預編譯的
JSP),MockRequestDispatcher,MockServletConfig看名稱就知道大概是mock什麼的。
13.@Required註解
@Required註解應用於bean屬性的setter方法,它表明影響的bean屬性在配置時必須放在XML配置文件中。
使用@Required但不關聯bean 來註解setter方法,將會發生BeanInitializationException 的異常
14.Spring框架中bean的生命週期
Spring容器讀取XML文件中bean的定義並實例化bean。
Spring根據bean的定義設置屬性值。
如果該Bean實現了BeanNameAware接口,Spring將bean的id傳遞給setBeanName()方法。
如果該Bean實現了BeanFactoryAware接口,Spring將beanfactory傳遞給setBeanFactory()方法。
如果任何bean BeanPostProcessors 和該bean相關,Spring調用postProcessBeforeInitialization()方法。
如果該Bean實現了InitializingBean接口,調用Bean中的afterPropertiesSet方法。
如果bean有初始化函數聲明,調用相應的初始化方法。 如果任何bean BeanPostProcessors 和該bean相關,調用postProcessAfterInitialization()方法。
如果該bean實現了DisposableBean,調用destroy()方法
15.Spring框架的基本模塊如下所示:
Core module
Bean module
Context module
Expression Language module
JDBC module
ORM module
OXM module
Java Messaging Service(JMS) module
Transaction module
Web module
Web-Servlet module
Web-Struts module
Web-Portlet module
16.有兩個重要的bean生命週期方法。
第一個是setup方法,該方法在容器加載bean的時候被調用。
第二個是teardown方法,該方法在bean從容器中移除的時候調用。
bean標籤有兩個重要的屬性(init-method 和 destroy-method),你可以通過這兩個屬性定義自己的初始化方法和析構方法。
Spring也有相應的註解:@PostConstruct 和 @PreDestroy。
17.spring事務的隔離級別和傳播行爲
隔離級別
- DEFAULT使用數據庫默認的隔離級別
- READ_UNCOMMITTED會出現髒讀,不可重複讀和幻影讀問題
- READ_COMMITTED會出現重複讀和幻影讀
- REPEATABLE_READ會出現幻影讀
- SERIALIZABLE最安全,但是代價最大,性能影響極其嚴重
傳播行爲:
- REQUIRED存在事務就融入該事務,不存在就創建事務
- SUPPORTS存在事務就融入事務,不存在則不創建事務
- MANDATORY存在事務則融入該事務,不存在,拋異常
- REQUIRES_NEW總是創建新事務
- NOT_SUPPORTED存在事務則掛起,一直執行非事務操作
- NEVER總是執行非事務,如果當前存在事務則拋異常
- NESTED嵌入式事務