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
(4) ……
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 />
- 在切面元件中追加註解標記
@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代理來實現的,對被代理物件的每個方法進行攔截,
在方法執行前啟動事務,方法執行完後根據是否有異常和異常的種類進行提交或回滾。