Spring day02

 

Spring提供了一站式解決方案:java

        1) Spring Core  spring的核心功能: IOC容器, 解決對象建立及依賴關係web

        2) Spring Web  Spring對web模塊的支持。spring

                                                能夠與struts整合,讓struts的action建立交給spring編程

                                                spring mvc模式設計模式

        3) Spring DAO  Spring 對jdbc操做的支持  【JdbcTemplate模板工具類】session

        4) Spring ORM  spring對orm的支持:mvc

                                                  既能夠與hibernate整合,【session】框架

                                                  也可使用spring的對hibernate操做的封裝工具

        5)Spring AOP  切面編程性能

        6)SpringEE   spring 對javaEE其餘模塊的支持

 

 

目標:

        1) 代理模式

                 靜態代理

                動態代理

                 Cglib代理

        2)手動實現AOP編程 【代理模式】

        3)AOP編程

                  * 註解方式實現

                  * XMl配置方式實現

        4) Spring DAO 

                 Spring對jdbc操做的支持

 

 

1. 代理模式

1.1 概述

 代理(Proxy)是一種設計模式, 提供了對目標對象另外的訪問方式;即經過代理訪問目標對象。 這樣好處: 能夠在目標對象實現的基礎上,加強額外的功能操做。(擴展目標對象的功能)。

 

代理模式的關鍵點: 代理對象與目標對象。

 

1.2 靜態代理

靜態代理,

        1) 代理對象,要實現與目標對象同樣的接口;

        2) 舉例:

                         保存用戶(模擬)

                                  Dao  ,  直接保存

                                  DaoProxy, 給保存方法添加事務處理

   總結靜態代理:

        1)能夠作到在不修改目標對象的功能前提下,對目標對象功能擴展。

        2)缺點:

                 --》  由於代理對象,須要與目標對象實現同樣的接口。因此會有不少代理類,類太多。

                 --》  一旦接口增長方法,目標對象與代理對象都要維護。

 

解決:

        代理工廠?  可使用動態代理。

 

1.3 動態代理

動態代理,

        1)代理對象,不須要實現接口;

        2)代理對象的生成,是利用JDKAPI, 動態的在內存中構建代理對象(須要咱們指定建立 代理對象/目標對象 實現的接口的類型;);

        3)  動態代理, JDK代理, 接口代理;

 

JDK中生成代理對象的API:

|-- Proxy

        static Object newProxyInstance(

ClassLoader loader,       指定當前目標對象使用類加載器

 Class<?>[] interfaces,     目標對象實現的接口的類型

InvocationHandler h       事件處理器

 動態代理總結:

        代理對象不須要實現接口,可是目標對象必定要實現接口;不然不能用動態代理!
        (class  $Proxy0  implements IuserDao)

  思考:

        有一個目標對象,想要功能擴展,但目標對象沒有實現接口,怎樣功能擴展?

        Class  UserDao{}

        // 子類的方式

        Class subclass  extends  UserDao{}

                                          

        以子類的方式實現(cglib代理)

 

 

1.4 Cglib代理

Cglib代理,也叫作子類代理。在內存中構建一個子類對象從而實現對目標對象功能的擴展。

 

JDK的動態代理有一個限制,就是使用動態代理的對象必須實現一個或多個接口。若是想代理沒有實現接口的類,就可使用CGLIB實現。

  CGLIB是一個強大的高性能的代碼生成包,它能夠在運行期擴展Java類與實現Java接口。它普遍的被許多AOP的框架使用,例如Spring AOP和dynaop,爲他們提供方法的interception(攔截)。

 CGLIB包的底層是經過使用一個小而快的字節碼處理框架ASM,來轉換字節碼並生成新的類。不鼓勵直接使用ASM,由於它要求你必須對JVM內部結構包括class文件的格式和指令集都很熟悉。

 

 

Cglib子類代理:

        1) 須要引入cglib – jar文件, 可是spring的核心包中已經包括了cglib功能,因此直接引入spring-core-3.2.5.jar便可。

        2)引入功能包後,就能夠在內存中動態構建子類

        3)代理的類不能爲final, 不然報錯。

        4) 目標對象的方法若是爲final/static, 那麼就不會被攔截,即不會執行目標對象額外的業務方法。

 

       

在Spring的AOP編程中,

        若是加入容器的目標對象有實現接口,用JDK代理;

        若是目標對象沒有實現接口,用Cglib代理;

AOP 面向切面的編程,

        AOP能夠實現「業務代碼」與「關注點代碼」分離

分析總結:

        關注點代碼,就是指重複執行的代碼。

        業務代碼與關注點代碼分離,好處?

     關注點代碼寫一次便可;

     開發者只須要關注核心業務;

     運行時期,執行核心業務代碼時候動態植入關注點代碼; 【代理】

 

 

如何分離?

        過程式/對象式/代理模式分離

3. AOP編程

3.1 概述:

Aop  aspect object programming  面向切面編程

        功能: 讓關注點代碼與業務代碼分離!

關注點,

        重複代碼就叫作關注點;

切面,

         關注點造成的類,就叫切面(類)!

         面向切面編程,就是指 對不少功能都有的重複的代碼抽取,再在運行的時候網業務方法上動態植入「切面類代碼」。

切入點,

        執行目標對象方法,動態植入切面代碼。

        能夠經過切入點表達式,指定攔截哪些類的哪些方法; 給指定的類在運行的時候植入切面類代碼。

 

3.2 註解方式實現AOP編程

步驟:

1) 先引入aop相關jar文件           (aspectj  aop優秀組件)                                  

        spring-aop-3.2.5.RELEASE.jar   【spring3.2源碼】

aopalliance.jar                            【spring2.5源碼/lib/aopalliance】

aspectjweaver.jar                       【spring2.5源碼/lib/aspectj】或【aspectj-1.8.2\lib】

aspectjrt.jar                                【spring2.5源碼/lib/aspectj】或【aspectj-1.8.2\lib】

 

注意: 用到spring2.5版本的jar文件,若是用jdk1.7可能會有問題。

                 須要升級aspectj組件,即便用aspectj-1.8.2版本中提供jar文件提供。

2) bean.xml中引入aop名稱空間

 

 

3) 開啓aop註解

 

4) 使用註解

@Aspect                                                        指定一個類爲切面類            

@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")  指定切入點表達式

 

@Before("pointCut_()")                                前置通知: 目標方法以前執行

@After("pointCut_()")                                  後置通知:目標方法以後執行(始終執行)

@AfterReturning("pointCut_()")             返回後通知: 執行方法結束前執行(異常不執行)

@AfterThrowing("pointCut_()")                  異常通知:  出現異常時候執行

@Around("pointCut_()")                              環繞通知: 環繞目標方法執行

3.3 XML方式實現AOP編程

 

Xml實現aop編程:

        1) 引入jar文件  【aop 相關jar, 4個】

        2) 引入aop名稱空間

        3)aop 配置

                 * 配置切面類 (重複執行代碼造成的類)

                 * aop配置

                         攔截哪些方法 / 攔截到方法後應用通知代碼

3.4  切入點表達式

切入點表達式,

        能夠對指定的「方法」進行攔截;  從而給指定的方法所在的類生層代理對象。

 

4. Spring對jdbc支持

 

使用步驟:

        1)引入jar文件

spring-jdbc-3.2.5.RELEASE.jar

spring-tx-3.2.5.RELEASE.jar

        2) 優化

相關文章
相關標籤/搜索