一、Spring
1.1 Spring原理
Spring是一個開源框架,為簡化java企業級應用開發而生。Spring可以使得簡單的JavaBean實現以前只有EJB才能實現的功能。Spring是遵從約定大於配置的框架,主要的核心在於依賴注入和控制反轉;
Spring的核心:
控制反轉(IOC):Spring容器使用工廠模式為我們建立了所需要的物件,不需要我們直接的過度耦合的new或者getInstance等構造一個物件例項。實現解耦的能力。這是控制反轉的思想。主要表現在,當我們使用Spring Config XML檔案時,在一面以<bean>標籤的形式申明物件id和類路徑。spring應用上下文載入該配置檔案時讀取相關配置時,通過呼叫工廠類和反射機制去建立該物件。不需要我們建立,直接呼叫spring提供的物件就可以了。
依賴注入(DI): Spring使用JavaBean物件的set方法或者帶引數的構造方法為我們建立所需物件時將其所屬性自動設定所需要的值的過程,就是依賴注入的思想。
面向切面程式設計(AOP): 面向切面程式設計AOP的底層是動態代理,Spring提供了兩種動態代理,一個採用介面的JDK動態代理,一個採用類的CGLIB方式實現動態代理。
1.2 Spring中的設計模式
- 單例模式——spring配置檔案中的bean,@Bean註解的方法,@Autowire、@Controller/@RestController、@Service、@Component註解的方法預設為單例模式。
- 代理模式——動態代理使用者AOP
- 模板方法模式——用來解決程式碼重複問題。比如:RestTemplate、JmsTemplate、JpaTemplate;
- 工廠模式——使用工廠模式解決建立物件不會對使用者暴露建立邏輯的問題。Spring使用BeanFactory來建立物件的例項。
1.3 Spring的常用註解
註解的啟動:註解裝配預設是關閉的。所以需要在Spring的核心配置檔案中配置使用給予註解的裝配模式。
<context:annoation-config/>
常用的註解:
@Required:該註解應用於設定方法
@Autowired:該註解應用於有值設值方法、非設值方法、構造方法和變數
@Qualifier:該註解和@AutoWired搭配使用,用於消除的定bean自動裝配的歧義
1.4 Spring Bean的生命週期
bean定義: 在配置檔案中使用<bean></bean>來定義
bean初始化:
- 在配置檔案中通過制定的init-method屬性來完成
- 實現org.springframework.beans.factory.InitializingBean介面
bean呼叫:有三種方式可以得到bean例項,並進行呼叫
bean銷燬:銷燬有兩種方式
- 實現配置檔案制定的destory-method屬性
- 實現org.springframework.bean.factory.DisposeableBean介面
1.5 Spring結構圖
1.6 Spring的作用
- Spring根據配置檔案建立以及組裝物件之間的依賴關係
- Spring面向切面程式設計能增強程式碼業務邏輯,比如實現日誌記錄、效能統計、安全控制,做到無侵入性
- Spring簡化資料庫管理以及事務使用
- Srping容器能夠整合JAVAEE和更多的第三方開發架包,整合更多技術
1.7 Spring事務
宣告式事務管理的定義:用在Spring配置檔案中的宣告式的處理事務來代替程式碼式的處理事務。這項的好處是:事務管理不侵入開發的元件。因為事務管理是屬於系統層面的服務,而不是業務邏輯的一部分,這樣拆封維護起來極其方便。
宣告式事務管理有兩種配置:配置檔案和基於註解的
配置檔案:
####基於TransactionInterceptor的宣告式事務管理:有兩個次要屬性:transactionManager,用來制定
一個事務治理器,並將具體事務相關的操作請託給它;另一個是Properties型別的transcationAttributes
屬性,該屬性的每一個鍵值對中,鍵制定的是方法名,方法名可以行使萬用字元,而值就是表現呼應方法的所運用的
事務屬性。
<bean id="transcationInterceptor"
class="org.springframework.transcation.interceptor.TranscationInterceptor">
<property name="transactionManager" ref="transcationManager"/>
<property name="transactionAttributes">
<props>
<!------需要新增事務的方法---------------> <prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="bankService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="interceptorNames">
<list>
<idref bean="transactionInterceptor"/>
</list>
</property>
</bean>
<bean id="bankServiceTarget"
class="....................BankServiceImpl>
<property name="bankDao" ref="bankDao"/>
</bean>複製程式碼
#########基於TransactionProxyFactoryBean的宣告式事務管理:配置檔案比上述簡化了很多。也成Spring
的宣告式事務治理
<bean id="bankServiceTarget"
class=".......................BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<bean id="bankService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="transcationManager" ref="transactionManager"/>
<property name="transcationAttributes">
<props>
<!------需要新增事務的方法---------------> <prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</bean>複製程式碼
#############基於<tx>名稱空間的宣告式事務治理:在前面兩種方法的基礎上,Spring2.x引入了<tx>名稱空間,
聯絡形式<aop>名稱空間。
<bean id="bankService"
class=".......................BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<tx:advice id="bankAdvice" transcation-manager="transactionManager">
<tx:attributes>
<!------需要新增事務的方法--------------->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!--------在類中的transfer方法上新增切點------------->
<aop:pointcut id="bankPointcut" expression="execution(**.transfer(..))"/>
<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config>複製程式碼
基於註解的宣告式事務管理:使用註解@Transcational可以浸染於介面、介面方法、類和類方法上,被註解的方法都具有該型別的事務屬性
@Transcational(propagation=Propagation.REQUIRED)
public boolean transfer(Long fromId,Long toId,double amount){
return bankDao.transfer(fromId,toId,amount);
}複製程式碼
程式設計式事務與宣告式事務的區別:
- 程式設計式事務需要程式設計師自己編寫事務處理,然後呼叫。
- 宣告式事務是在配置檔案中配置,一般搭配在框架中使用
- 宣告式事務將系統和業務邏輯分開,減少程式碼侵入
1.8 BeanFactory常用實現類
BeanFactory是工廠模式的一個實現。提供控制反轉的功能,用來把應用的配置和依賴從真正的應用程式碼中分離。常用的BeanFactory實現有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。
其中最常用的就是XmlBeanFactory,它根據xml檔案中的定義載入beans,該容器從xml檔案讀取配置後設資料並用後設資料建立一個完全配置的系統或應用。
Spring配置檔案有何用處:Spring Config Xml包含了類資訊,描述瞭如何配置它們,以及如何相互呼叫。
ApplicationContext的實現類:
- FileSystemXmlApplicationContext:此容器從一個xml檔案中載入beans的定義,xml Bean配置檔案的全路徑必須提供給它的建構函式
- ClassPathXmlApplicationContext:此容器也從一xml檔案中載入beans的定義,需要想它的建構函式中傳入classpath,因為它通過classpath查詢bean檔案
- WebXmlApplicationContext:此容器載入的是web.xml
BeanFactory與ApplicationContext有什麼區別?
- BeanFactory:基礎型別的ioc容器,提供完成的ioc服務支援,如果沒有特殊制定的,預設採取延遲初始化策略。相對來說,容器啟動初期速度較快,所需資源有限。
- ApplicationContext:ApplicationContext是在BeanFactory的基礎上構建的,是相對比較高階的容器實現,除了BeanFactory的所有支援外,ApplicationContext管理的物件,在容器啟動後預設全部初始化並且繫結完成。
1.9 Spring AOP
AOP,面向切面程式設計,它利用一種稱為“橫切”的技術,剖開封裝物件的內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,成為Aspect(切面),簡單的說將那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於較少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作行和可維護性。
Spring 通知型別
通知是在方法執行之前或之後要做的動作,實際上是程式執行時通過SpringAop觸發的程式碼段
Spring切面可以應用五種型別的通知:
- before 前置通知,在一個方法執行之前被呼叫
- after 後置通知,在一個方法執行之後被呼叫,無論方法是否執行成功
- after-running 僅僅當方法成功執行之後觸發
- around 環繞通知,在方法執行之前到方法執行之後呼叫的通知
二、SpringMVC
SpringMVC的工作原理
- 使用者向伺服器傳送請求,請求被SpringMVC前端控制器DispatcerhServlet捕獲;
- DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URL),然後根據該URL呼叫HandlerMapping將請求對映到處理器HandlerExcutionChain;
- DispatchServlet根據獲得Handler選擇一個合適的HandlerAdapter介面卡處理;
- Handler對資料處理完成以後將返回一個ModelAndView()物件給DispatcherServlet;
- Handler返回的ModelAndView()只是一個邏輯檢視並不是一個正式的檢視,DispatcherServlet通過ViewResolver檢視解析器將邏輯檢視轉化為真正的檢視View;
- DispatcherServlet通過Model解析出ModelAndView()中的引數進行解析最終展現完成的view並返回給客戶端;