1. 程式人生 > >Spring框架總結

Spring框架總結

簡介

創立於 2003年 ,
是為了解決企業級開發的複雜性的!
是一個分層的se/ee(javase和java ee)一站式輕量級開源框架

作用:

1.Spring是一個開元的輕量級的應用開發框架,其目的是用於簡化企業級應用程式開發,減少侵入;
2.Spring的IOC和AOP應用,將元件的耦合度降至最低,即解耦,便於系統的維護和升級;
3.可以與第三方框架和技術整合應用,可以自由選擇技術進行開發。

註解方式:

a)@Component        為通用註解
b)@Repository       為持久層元件註解
c)@Service
為業務層元件註解 d)@Controller 為控制層註解 e)@ScopeBean的作用域註解 f)@Autowired 為指定Bean之間依賴關係的註解 g)@Inject 為指定Bean之間依賴關係的註解 h)@Value 為注入Spring表示式值的註解 j)@ResponseBodyAjax返回型別的註解

工作流程

  • 同步請求與響應處理(普通瀏覽器請求,整個頁面重新整理)

這裡寫圖片描述


  • 非同步請求與響應處理(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方式生成目標元件的子類,重寫目標元件方法。

請求轉發/請求重定向

  1. 請求轉發
    return “forward:xx.do”;
  2. 請求重定向
    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代理來實現的,對被代理物件的每個方法進行攔截,
在方法執行前啟動事務,方法執行完後根據是否有異常和異常的種類進行提交或回滾。