Spring 框架總結
什麼是框架,框架是讓你從一些通用的重複的工作中解放出來關注於業務程式碼的實現
是其中包含著一些設計模式的實現和底層程式碼的包裝,學習並使用了這麼久的Spring框架,給自己寫個總結
簡介
創立於 2003年 ,
是為了解決企業級開發的複雜性的!
是一個分層的se/ee(javase和java EE)一站式輕量級開源框架
作用:
1.Spring是一個開源的輕量級的應用開發框架,其目的是用於簡化企業級應用程式開發,減少侵入;
2.Spring的IOC和AOP應用,將元件的耦合度降至最低,即解耦,便於系統的維護和升級;
3.可以與第三方框架和技術整合應用,可以自由選擇技術進行開發。
註解方式:
a)@Component 為通用註解 b)@Repository 為持久層元件註解 c)@Service 為業務層元件註解 d)@Controller 為控制層註解 e)@Scope 為Bean的作用域註解 f)@Autowired 為指定Bean之間依賴關係的註解 g)@Inject 為指定Bean之間依賴關係的註解 h)@Value 為注入Spring表示式值的註解 j)@ResponseBody 為Ajax返回型別的註解
工作流程
- 同步請求與響應處理(普通瀏覽器請求,整個頁面重新整理)
- 非同步請求與響應處理(Ajax請求,頁面區域性重新整理)
spring功能的作用
IOC :控制反轉(獲取方式發生反轉,由最初new方式建立, 轉為由框架建立、注入,這樣可以降低物件 之間的耦合度。)
AOP:面向切程式設計(是一種程式設計思想,將系統中非核心的業務提取出來,進行單獨處理)
WebMVC :MVC結構的實現、與其他 Web技術整合(m模型v檢視c控制)
DAO:與 JDBC整合和事務管理 (整合JDBC提供了封裝,簡化了DAO元件的編寫)
ORM :與 ORM 框架整合
springMVC實現,主要實現元件如下
DispatcherServlet (控制器, 請求入口)
HandlerMapping (控制器, 請求派發)
Controller (控制器, 請求處理流程)
ModelAndView (模型, 封裝處理結果和檢視)
ViewResolver(檢視, 檢視顯示處理器)
Spring的AOP和IOC在專案中都是為了解決系統程式碼耦合度過高的問題。使程式碼重用度高、易於維護。比如事務、日誌和安全等。
IoC的概念
IoC,Inversion of Control,控制反轉。
物件的協作關係由物件自己負責。
依賴注入:物件的協作關係有容器來建立。
IOC的型別
(1) 基於特定介面(侵入式方案)
(2) 基於set方法
(3) 基於構造器
Spring容器
Spring容器負責生成、組裝、銷燬元件,並負責事件處理等功能。
(1) BeanFactory
① 核心容器,負責元件生成和裝配 ② 實現主要包括Xml BeanFactory
- (2) ApplicationContext
(3) WebApplicationContext
IoC的使用
Resource:interface,用來包裝資源
xmlBeanFactory:BeanFactory的一個實現,使用Resource物件來查詢配置檔案
BeanFactory.gerBean(“BeanId”):取得以引數命名,或者Id等於引數值的一個Bean例項。
BeanFactory(容器)在預設情況下,會採用單例方式返回物件。容器只到呼叫getBean方法時,才會例項化某個物件。
(1) Spring可以採用XML或者.properties檔案作配置
(2) 配置檔案(XML)
根元素可以有多個子元素,每個代表一個需要裝配的物件。
1、setter注入
(1) 注入簡單屬性
<beans>
<bean id=”BeanId” class=”classpath” autowire=” ” dependency-check=” ”>
<property name=”parameterName”>
<value>parameterValue</value>
</property>
</bean>
</beans>
對於基本型別,Spring容器會自動作型別轉換,以便賦值。
(2) 注入物件
A、讓Spring容器在當前配置檔案中找到相應的Bean,並呼叫set方法,注入該Bean。B、將一個Bean的定義巢狀在另一個Bean中(可讀性差),被巢狀的Bean不能採用getBean()返回
C、採用<ref bean=” ”>
搜尋多個配置檔案來注入
(3) 注入集合型別
① Set
Set中存放字串,物件,集合,不允許重複② List
List中可以放入字串,物件,List③ Map
Map 有子元素來存取key,value,key只能為String④ Properties
Properties有子元素
spring的AOP
AOP從執行的角度考慮程式的流程,提取業務處理過程的切面。
將程式中的交叉業務邏輯提取出來,稱之為切面。將這些切面動態織入到目標物件,然後生成一個代理物件的過程。
Aspect Oriented Programming 面向方面程式設計(面向切面程式設計) 以切面為核心程式設計/找切面、追加共通邏輯/掌握應用
Object Oriented Programming 面向物件程式設計 以物件為核心程式設計/類設計/設計原則或模式
AOP還是已OOP為基礎,只不過是將共通邏輯單獨封裝成元件,然後通過配置將元件動態切入到原有元件方法中。
優點:可以在不修改原有元件功能程式碼情況下,擴充元件功能,對共通需求和傳統業務需求進行解耦。
AOP使用
將程式中的交叉業務邏輯提取出來,稱之為切面。將這些切面動態織入到目標物件,然後生成一個代理物件的過程。
1. 切面元件(加什麼功能?)Aspect
在元件中尋找共通位置和時機,將追加功能切入到原有元件中。追加的功能元件一般被稱為切面元件。
2. 切入點(給誰加?)Pointcut
切入點用於指定切入目標元件或方法。Spring提供了多種表示式
方法限定表示式
execution(修飾符? 返回型別 方法名(引數列表) 丟擲異常?)
//所有以find開頭的方法要被切入追加功能 execution(* find*(..))
//DeptService類中所有方法要切入追加功能 execution(*
cn.xdl.service.DeptService.*(..)) //cn.xdl.service包下所有類所有方法
execution(* cn.xdl.service..(..)) //cn.xdl.service包及子包下所有類所有方法
execution(* cn.xdl.service...(..))型別限定表示式
within(型別)
//DeptService元件所有方法要被切入追加功能 within(cn.xdl.service.DeptService)
//cn.xdl.service包下所有類所有方法 within(cn.xdl.service.*)
//cn.xdl.service包及子包下所有類所有方法 within(cn.xdl.service..*)Bean名稱限定表示式
bean(Spring容器中元件的id名)
//id=deptService元件的所有方法 bean(deptService) //id以Service結尾的元件的所有方法
bean(*Service)
AOP核心概念
1、Aspect(切面)—切面,是對交叉業務邏輯的統稱。
2、Joinpoint(連線點)—連線點,指切面可以織入到目標物件的位置(方法,屬性等)。
3、Advice(通知)—通知,指切面的具體實現。
4、Pointcut(切入點)—切入點,指通知應用到哪些類的哪些方法或屬性之上的規則。
5、Introduction(引入)—引入,指動態地給一個物件增加方法或屬性的一種特殊的通知。
6、Weaving(織入)—織入,指將通知插入到目標物件。
7、Target(目標物件)—目標物件,指需要織入切面的物件。
8、Proxy(代理物件)—代理物件,指切面織入目標物件之後形成的物件。
通知(什麼時候加?)Advice
通知用於決定切面元件追加的時機,例如在原有元件方法前、方法後、丟擲異常之後等。
try{
//追加邏輯–》前置通知
//原有元件的方法
//追加邏輯–》後置通知 }catch(){
//追加邏輯–》異常通知 }finally{
//追加邏輯–》最終通知
}
環繞通知:等價於前置+後置綜合效果
AOP案例1
要求:在呼叫DeptDao每個方法之前,都要列印一個訊息”進入DeptDao執行處理”
1. 分析
- 切面元件:LoggerBean方法,在方法中追加功能邏輯
通知:使用前置通知
切入點:DeptDao元件所有方法
within(cn.xdl.dao.JdbcDeptDao)
2. 編寫切面元件
public class LoggerBean { //前置通知方法 public void mybefore(){ System.out.println("進入了DeptDao元件方法執行處理"); } }
3. AOP XML 配置
AOP配置
<aop:aspectj-autoproxy />
- 1
- 在切面元件中追加註解標記
@Component//等價於定義 @Aspect//等價於定義 public class LoggerBean { //前置通知方法
@Before(“execution(* cn.xdl.dao.JdbcDeptDao.find*(..))”)//等價於
public void mybefore(){
System.out.println(“進入了DeptDao元件方法執行處理”);}
}
AOP案例2
需求:為程式中處理元件追加效能監測日誌,記錄哪個方法執行了多長時間。
1. 分析
通知:採用環繞通知
切入點:程式中所有自定義元件 within(cn.xdl..*)
切面元件:計算出執行時間,記錄到資料庫或檔案中
2. 編寫切面元件
@Component
@Aspect
public class WatchBean {
@Around(“within(cn.xdl..*)”) public Object watch(ProceedingJoinPoint pjp) throws Throwable{
//加前置邏輯,在原有元件方法前呼叫
long begin = System.currentTimeMillis();
Object obj = pjp.proceed();//執行原有元件的方法
//加後置邏輯,在原有元件方法後呼叫
long end = System.currentTimeMillis();
long time = end-begin;//用時(毫秒)
//獲取目標方法資訊
String targetClass = pjp.getTarget().getClass().getName();//獲取目標元件型別名
String methodName = pjp.getSignature().getName();//獲取執行的目標方法名
System.out.println(targetClass+”類的”+methodName+”方法耗時”+time+”毫秒”);
return obj; }
}
3. AOP配置
追加@Component、@Aspect、@Around註解標記、@Aspect切面元件、@Around環繞
##AOP原理(動態代理技術)
當使用Spring AOP切入目標元件之後,從Spring容器再獲取目標元件,容器返回的是一個動態生成的型別(代理類)物件,該代理類物件重寫原有目標元件的方法,在重寫方法中呼叫原有元件方法功能+切面元件的追加功能。
該技術被稱為動態代理技術,Spring使用了下面兩種:
- 目標元件有介面採用下面機制(JDK Proxy API)
建立一個新的元件,元件實現了原有介面,把所有方法完成
- 目標元件沒有介面採用下面機制(CGLIB工具,推薦)
建立一個新的元件,元件繼承了原有目標元件,把所有方法重寫
- 可以在aop配置強制指定目標元件生成機制<aop:aspectj-autoproxy proxy-target-class="true"/>
強制Spring容器採用CGLIB方式生成目標元件的子類,重寫目標元件方法。
請求轉發/請求重定向
- 請求轉發
return “forward:xx.do”;- 請求重定向
return “redirect:xx.jsp”;
Spring的Bean有以下五種作用域:
1.singleton:SpringIoc容器只會建立該Bean的唯一例項;
2.prototype:每次請求都建立一個例項;
3.request:每次HTTP請求都會產生一個新的bean。
4.session :每次會話建立一個例項;
5.global session :全域性的HttpSession中,容器會返回該bean的同一個例項。
事物攔截器的實現原理。
spring中的事務管理是通過AOP代理來實現的,對被代理物件的每個方法進行攔截,
在方法執行前啟動事務,方法執行完後根據是否有異常和異常的種類進行提交或回滾。