欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的Spring框架中AOP項目的一般配置和部署教程

 更新時間:2016年04月27日 16:54:24   作者:野性的呼喚  
這篇文章主要介紹了Java的Spring框架中AOP項目的一般配置和部署教程,AOP面向方面編程的項目部署結構都比較類似,因而也被看作是Spring的一種設計模式使用,需要的朋友可以參考下

0.關于AOP
面向切面編程(也叫面向方面編程):Aspect Oriented Programming(AOP),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內容。利用AOP可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。

AOP是OOP的延續(xù)。

主要的功能是:日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等等。

主要的意圖是:將日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等代碼從業(yè)務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業(yè)務邏輯的方法中,進而改變這些行為的時候不影響業(yè)務邏輯的代碼。

可以通過預編譯方式和運行期動態(tài)代理實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的一種技術。AOP實際是GoF設計模式的延續(xù),設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,提高代碼的靈活性和可擴展性,AOP可以說也是這種目標的一種實現(xiàn)。

在Spring中提供了面向切面編程的豐富支持,允許通過分離應用的業(yè)務邏輯與系統(tǒng)級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發(fā)。應用對象只實現(xiàn)它們應該做的——完成業(yè)務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統(tǒng)級關注點,例如日志或事務支持。

1.通過PropertyPlaceholderConfigurer在Spring中加載其他外部配置文件或者屬性文件:
在很多javaEE工程中,Spring的角色非常重要,是一個管理其他模塊和組件的輕量級容器,Spring經常需要管理Struts、Ibatis、Hibernate等,這些開源框架的配置文件就通過Spring的PropertyPlaceholderConfigurer加載在Spring中進行管理,另外,數(shù)據庫連接信息、JNDI連接信息屬性文件等也可以通過PropertyPlaceholderConfigurer加載到Spring中來管理。用法如下:
(1).通過PropertyPlaceholderConfigurer將其他文件加載到Spring中:
在spring配置文件中添加如下配置:

<bean class=“org.springframework.beans.factory.config.PropertyPlaceholderConfigurer“> 
    <property name=“l(fā)ocations“> 
       <value>classpath:要加載的文件名</value> 
       …… 
    </property> 
</bean> 

 
(2).經過(1)中的配置要加載的配置或屬性文件就被加載到spring中,如果還需要在運行時使用加載進來的配置或數(shù)據文件的一些信息,如使用數(shù)據庫連接信息或者JNDI連接信息時,就可以使用類型EL表達式的語法進行引用,例如:

<bean id=”dataSource” destroy-method=”close” class=”org.apache.common.dbcp.BasicDataSource”> 
    <!--假設數(shù)據庫連接信息寫在外部屬性文件中,已經被spring加載--> 
    <property name=”driverClassName” value=”${driver}”/> 
    <property name=”url” value=”${url}”/> 
    <property name=”username” value=”${username}”/> 
    <property name=”password” value=”${password}”/> 
</bean> 

 
注意:也可以使用<context:Property-Placeholderlocation=”classpath:要加載的文件名”/>

2.Java的動態(tài)代理:
Spring的面向切面編程(AOP)底層實現(xiàn)原理是動態(tài)代理,因此在學習面向切面編程之前必須先了解動態(tài)代理。
Java中動態(tài)代理應用非常廣泛,動態(tài)代理是23中設計模式中非常常用的經典設計模式之一。動態(tài)代理的原理是,當要調用一個目標對象或者其方法時,系統(tǒng)并不是直接返回目標對象,而是返回一個代理對象,通過這個代理對象去訪問目標對象或者目標對象的方法。
動態(tài)代理的簡單原理如下:
客戶端調用者——>代理對象——>被調用的目標對象。
當客戶端調用代理對象時,代理對象委派目標對象調用其業(yè)務方法。
動態(tài)代理分為兩種,針對接口的動態(tài)代理和針對普通類的動態(tài)代理,java中的動態(tài)代理是真的接口的動態(tài)代理,cglib是針對普通類的動態(tài)代理,目標javaEE的依賴包和Spring的jar包中已經包含了cglib相關jar包,因此即可以對代理也可以對普通類進行動態(tài)代理。
(1).java的針對接口動態(tài)代理:
Java中的動態(tài)代理只能針對接口進行動態(tài)代理,因此,目標對象必須實現(xiàn)接口,代理對象要實現(xiàn)目標對象的所有接口。工作流程如下:

a.動態(tài)代理類編寫:
注意:動態(tài)代理必須實現(xiàn)InvocationHandler接口,同時實現(xiàn)以下方法:
 

復制代碼 代碼如下:

Object invoke(Objectm代理實例,Method代理實例上調用的接口方法的Method 實例,Object[] 傳入代理實例上方法調用的參數(shù)值的對象數(shù)組);  
 

安裝JDK的文檔說明,該方法作用是傳遞代理實例、識別調用方法的 java.lang.reflect.Method 對象以及包含參數(shù)的 Object 類型的數(shù)組。調用處理程序以適當?shù)姆绞教幚砭幋a的方法調用,并且它返回的結果將作為代理實例上方法調用的結果返回。

b.創(chuàng)建代理對象:
 

Proxy.newProxyInstance(類加載器, Class<?>[]接口數(shù)組,回調代理對象(一般是this)) 


當調用目標對象方法時,通過該方法創(chuàng)建目標對象的代理對象,代理對象會自動調用其invoke方法調用目標對象,并將調用結果返回。

(2).cglib針對普通java類動態(tài)代理:
cglib創(chuàng)建動態(tài)代理時,不要求目標類必須實現(xiàn)接口,其工作流程如下:
a.動態(tài)代理類編寫:
 

Enhancer enhancer = new Enhancer(); 
//設置目標類的父類為其本身 
enhancer.setSuperclass(目標類對象.getClass()); 
//設置回調對象為動態(tài)代理對象本身 
enhancer.setCallback(this); 

 
b.實現(xiàn)MethodInterceptor接口:
實現(xiàn)以下方法:

Object intercept(Objectm代理實例,Method代理實例上調用的接口方法的Method 實例,Object[] 傳入代理實例上方法調用的參數(shù)值的對象數(shù)組,MethodProxy 方法代理實例); 
 
注意:cglib不但可以針對類動態(tài)代理,還可以針對方法動態(tài)代理。

3.面向切面編程(AOP)的基礎概念:
以一個普通的java方法來舉例
 

public 返回類型 方法名(參數(shù)列表){ ——>環(huán)繞通知 
    方法前處理代碼  ——>   前置通知 
try{ 
    方法具體實現(xiàn)(方法體)……. 
    方法后處理代碼  ——>   后置通知 
}Catch(異常類型 e){ 
    異常處理……    ——>   例外通知 
}finally{ 
    最后處理代理……    ——>   最終通知 
} 
} 


a. 橫切關注點:如上面5個通知的位置,在java對象中,可以這些具有類似共同處理邏輯的位置加入如權限驗證、事物處理、日志記錄等處理邏輯的對象稱為橫切關注點,面向對象編程(OOP)的關注點是縱向將現(xiàn)實世界的事物抽象成編程的對象模型。而面向切面編程(AOP)的關注點是橫向的,它將編程對象模型中擁有類似處理邏輯的地方抽象出來形成切面,而編程對象中的處理邏輯就是橫切關注點。
b. 切面(Aspect):將橫切關注點抽象就形成切面,與類類似,二者關注點不同,類是事物特性的抽象,切面是橫切關注點的抽象。
c. 連接點(Joinpoint):被攔截到的點,在Spring中指方法,因為spring只支持方法類型的連接點,即被攔截的方法。如上面例子的方法。
d. 切入點(Pointcut):指對連接點進行攔截的定義,是連接點的集合,即一系列被攔截方法的集合。
e. 通知(Advice):指攔截到連接點之后要做的事情,即攔截之后的邏輯處理。通常的權限驗證、事物處理、日志記錄等操作就是在通知中定義和完成的。
f. 目標對象(Target):代理的目標對象,即被攔截的對象。如上面例子中方法所在的對象。
g. 織入(Weave):指將切面應用到目標對象,并導致代理對象創(chuàng)建的過程。
h. 引入(Introduction):在不修改代碼的前提下,引入可以在運行期為類動態(tài)的添加一些方法和字段。

4. Spring中支持面向切面編程(AOP)的依賴包:
Spring解壓后目錄中的如下3個包:

lib/aspectj/aspectjweaver.jar
lib/aspectj/aspectjrt.jar
lib/cglib/cglib-nodep-2.1-3.jar

5. 在spring中使用面向切面編程(AOP)時,需要在spring配置文件中引入aop的命名空間,即添加如下的配置:

xmlns:aop=”http://www.springframework.org/schema/aop” 
“http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd” 

 
注意:Spring2.5以后提供兩種AOP方法,即基于xml配置文件方式和基于java注解方式。
若要使用注解方式的aop,需要在spring配置文件中添加如下的對象注解方式aop的支持:

<aop:aspectj-autoProxy/> 

 
6. JavaBean的包裝類——BeanWrapper:
Spring通過BeanWrapper類封裝一個javabean的行為,可以設置和獲取其屬性值,如:

BeanWrapper 包裝類對象 = BeanWrapperImpl(new 被包裝類()); 
包裝類對象.setPropertyValue(“屬性名”,”屬性值”); 

 
通過這種方法就可以給被包裝類設置屬性。

7. 基于注解方式的面向切面編程(AOP)開發(fā):
(1).在spring配置文件中加入對注解方法的aop支持。
(2).定義切面:
和創(chuàng)建普通類類似,在類前加上”@Aspect”注解,表明該類是一個切面。
(3).在切面中加入切入點:
切入點就是被攔截對象方法的集合,通常切入點定義在切面中某個對切入點進行處理的方法上。使用”@Pointcut”注解,語法如下:

@Pointcut(“execution(* com.test.service..*.*(..))”) 
public void anyMethod(){//方法名為切入點名 
切入點處理 
} 

 
語法參數(shù)詳解:
a. 第一個”*”:表示被攔截的方法是任意的返回類型。
b. com.test.service:這里是舉一個簡單的例子,表示要被攔截的包名,即被攔截的包。
c.被攔截包名后面的兩個”..”:表示被攔截包下面的子包也遞歸進行攔截,即被攔截的子包。
d. ”..”之后的”*”:表示被攔截包及其子包下面的所有類,即被攔截的類。
e. 最后一個”*”:表示被攔截類中的所有方法,即被攔截的方法。
f. ”(..)”:表示被攔截的方法接收任意的參數(shù),即被攔截的參數(shù)。
注意:切入點定義語法可以支持通配符,但是一定要嚴格遵循語法規(guī)則。如:

@Pointcut(“execution(*com.test.service..*.add*(..))”)

表示對com.test.service包及其子包下所有的類中以”add”開頭的方法進行攔截。
(4).在切面中添加通知:
Spring中通知位置請參看3中的小例子。
”@Before”注解:聲明前置通知。
“@AfterRutruning”注解:聲明后置通知。
“@After”注解:聲明最終通知。
“@AfterThrowing”注解:聲明例外通知。
“@Around”注解:聲明環(huán)繞通知。
一個定義通知的例子如下:

@Before(“anyMethod()(切面中聲明的切入點名)”) 
public void doAccessCheck(){ 
    …… 
} 

 
注意:環(huán)繞通知和其他4種通知的稍有不同,環(huán)繞通知的定義方式比較特別,環(huán)繞通知在整個方法調用前后都會起作用,因此必須使用連接點對象告訴連接點在環(huán)繞通知處理之后繼續(xù)其邏輯處理。其定義方式如下:

@Around(切入點名) 
public Object doBasicProfiling(ProcedingJoinPoint pjp) throws Throwable{ 
    …… 
    return pjp.proceed();//該句是告訴連接點繼續(xù)執(zhí)行其他的操作 
} 

8.基于注解方式的面向切面編程(AOP)開發(fā)的一些小技巧:
(1).獲取輸入參數(shù):
如:

@Before(“切入點名 && args(輸入參數(shù)名)”) 
public void doSomething(String 輸入參數(shù)名){……} 

 
(2).獲取返回結果:
如:

@AfterReturning(Pointcut=”切入點名”,returning=”返回結果名”) 
public void dosomething(String 結果名){……} 

 
9.基于XML方式的面向切面編程(AOP)開發(fā):
(1).定義切面類,在切面類中添加通知。
(2).將切面類想普通java類一樣在spring配置文件中配置。
(3).在spring配置文件中添加AOP配置如下:

<aop:config> 
    <!--配置切面--> 
    <aop:aspect id=”切面id” ref=”spring配置文件中切面類的id”> 
       <!--配置切入點--> 
       <aop:pointcut id=”切入點id” 
expression=”execution(* com.test.service..*.*(..))”/> 
       <!--配置通知--> 
       <aop:before pointcut-ref=”切入點id” method=”切面類中相應的處理方法”/> 
       <aop:after ……/> 
       …… 
</aop:aspect> 
</aop:config> 

 
10. Spring的事務處理(Spring的聲明式事務處理):
事務簡單來說是指數(shù)據庫中的一條最基本的操作,關于事務的詳細講解以后會在數(shù)據庫相關總結中具體說明。Spring的面向切面編程(AOP)一個最重要的應用是事務管理,Spring2.5以后版本的事務管理支持基于注解的方式和基于XML文件的方式兩種:
(1).基于注解方式的事務管理:
a. 在spring配置文件中添加事務管理的命名空間如下:

xmlns:ts=http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 

 
b. 在spring配置文件中配置事務管理器如下:
 

<bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”> 
    <property name=”dataSource” ref=”spring中配置的數(shù)據源bean的id”/> 
</bean> 

c.在spring配置文件中添加支持注解方式的事務配置項如下:

<tx:annotation-driventransaction-managertx:annotation-driventransaction-manager=”txManager(spring中配置的事務管理器bean的id)”/> 

 d.使用基于注解的事務管理:
在Spring所管理的JavaEE工程中,需要使用事務的業(yè)務邏輯地方加上“@Transactional”注解。

(2).基于XML文件方式的事務管理:
a. 在spring配置文件中配置事務管理器如下:

<bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”> 
    <property name=”dataSource” ref=”spring中配置的數(shù)據源bean的id”/> 
</bean> 

 b.在spring配置文件中添加事物管理的切面如下:

<aop:config> 
    <!--配置事務切入點--> 
    <aop:pointcut id=”transactionPointcut” 
Expression=”execution(* com.test.service..*.*(..))”/> 
<!--配置事務通知-->   
<aop:advisor advice-ref=”txAdvice” pointcut-ref=”transactionPointcut”/> 
</aop:config> 
 
c.在spring配置文件中為事務通知添加事物處理特性如下:
 
<tx:advice id=”txAdvice” transactionManager=”txManager”> 
    <tx:attributes> 
       <!--這里舉例將以get開頭的查詢方法設置為只讀,不支持事務--> 
       <tx:method name=”get*” read-only=”true” propagation=”NOT_SUPPORTED”/> 
       <!--其他的方法設置為spring默認的事物行為--> 
       <tx:method name=”*”/> 
    </tx:attributes> 
</tx:advice> 

相關文章

  • Java AOP動態(tài)代理詳細介紹

    Java AOP動態(tài)代理詳細介紹

    AOP是一種設計思想,是軟件設計領域中的面向切面編程,它是面向對象編程的一種補充和完善。本文將用Java實現(xiàn)AOP代理的三種方式,需要的可以參考一下
    2022-08-08
  • Java中的適配器模式詳解

    Java中的適配器模式詳解

    這篇文章主要介紹了Java中的適配器模式詳解,適配器模式(Adapter?Pattern)將某個類的接口轉換成客戶端期望的另一個接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個類可以協(xié)同工作,需要的朋友可以參考下
    2023-09-09
  • 淺談Maven 項目中依賴的搜索順序

    淺談Maven 項目中依賴的搜索順序

    這篇文章主要介紹了淺談Maven 項目中依賴的搜索順序,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 如何使用stream從List對象中獲取某列數(shù)據

    如何使用stream從List對象中獲取某列數(shù)據

    這篇文章主要介紹了如何使用stream從List對象中獲取某列數(shù)據問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java長度不足左位補0的3種實現(xiàn)方法

    Java長度不足左位補0的3種實現(xiàn)方法

    這篇文章主要介紹了Java長度不足左位補0的3種實現(xiàn)方法小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • IDEA SpringBoot 項目配置Swagger2的詳細教程

    IDEA SpringBoot 項目配置Swagger2的詳細教程

    這篇文章主要介紹了IDEA SpringBoot 項目配置Swagger2的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Spring boot攔截器實現(xiàn)IP黑名單的完整步驟

    Spring boot攔截器實現(xiàn)IP黑名單的完整步驟

    這篇文章主要給大家介紹了關于Spring boot攔截器實現(xiàn)IP黑名單的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring boot攔截器具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • Mybatis 自動映射(使用需謹慎)

    Mybatis 自動映射(使用需謹慎)

    這篇文章主要介紹了Mybatis 自動映射(使用需謹慎),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java如何批量執(zhí)行datax腳本

    Java如何批量執(zhí)行datax腳本

    這篇文章主要介紹了Java如何批量執(zhí)行datax腳本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 基于Java HttpClient和Htmlparser實現(xiàn)網絡爬蟲代碼

    基于Java HttpClient和Htmlparser實現(xiàn)網絡爬蟲代碼

    這篇文章主要介紹了基于Java HttpClient和Htmlparser實現(xiàn)網絡爬蟲代碼的相關資料,需要的朋友可以參考下
    2015-12-12

最新評論