您好,登錄后才能下訂單哦!
本篇內容主要講解“Java Spring之XML的AOP怎么配置”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java Spring之XML的AOP怎么配置”吧!
示例:
在學習 spring 的 aop 時,采用賬戶轉賬作為示例。把 spring 的 ioc 也一起應用進來。
此處包含了實體類,業務層和持久層代碼。沿用上一章節中的代碼即可。
此處要拷貝 spring 的 ioc 和 aop 兩組 jar 包
此處要導入 aop 的約束
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"></beans>
<!-- 配置 service --><bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> <property name="accountDao" ref="accountDao"></property></bean><!-- 配置 dao --><bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"> <property name="dbAssit" ref="dbAssit"></property></bean><!-- 配置數據庫操作對象 --><bean id="dbAssit" class="com.itheima.dbassit.DBAssit"> <property name="dataSource" ref="dataSource"></property> <!-- 指定 connection 和線程綁定 --> <property name="useCurrentConnection" value="true"></property></bean><!-- 配置數據源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property> <property name="user" value="root"></property> <property name="password" value="1234"></property></bean>
事務控制類
public class TransactionManager { //定義一個 DBAssit private DBAssit dbAssit ; public void setDbAssit(DBAssit dbAssit) { this.dbAssit = dbAssit; } //開啟事務 public void beginTransaction() { try { dbAssit.getCurrentConnection().setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } } //提交事務 public void commit() { try { dbAssit.getCurrentConnection().commit(); } catch (SQLException e) { e.printStackTrace(); } } //回滾事務 public void rollback() { try { dbAssit.getCurrentConnection().rollback(); } catch (SQLException e) { e.printStackTrace(); } } //釋放資源 public void release() { try { dbAssit.releaseConnection(); } catch (Exception e) { e.printStackTrace(); } } }
<!-- 配置通知 --><bean id="txManager" class="com.itheima.utils.TransactionManager"> <property name="dbAssit" ref="dbAssit"></property></bean>
aop:config:
作用:用于聲明開始 aop 的配置
<aop:config> <!-- 配置的代碼都寫在此處 --></aop:config>
aop:aspect:
id:給切面提供一個唯一標識。
ref:引用配置好的通知類 bean 的 id。
用于配置切面。
作用:
屬性:
<aop:aspect id="txAdvice" ref="txManager"> <!--配置通知的類型要寫在此處--></aop:aspect>
aop:pointcut:
expression:用于定義切入點表達式。
id:用于給切入點表達式提供一個唯一標識
用于配置切入點表達式。就是指定對哪些類的哪些方法進行增強。
作用:
屬性:
<aop:pointcut expression="execution( public void com.itheima.service.impl.AccountServiceImpl.transfer( java.lang.String, java.lang.String, java.lang.Float ))" id="pt1"/>
aop:before
切入點方法執行之前執行
method:用于指定通知類中的增強方法名稱
ponitcut-ref:用于指定切入點的表達式的引用
poinitcut:用于指定切入點表達式
用于配置前置通知。指定增強的方法在切入點方法之前執行
作用:
屬性:
執行時間點:
<aop:before method="beginTransaction" pointcut-ref="pt1"/>
aop:after-returning
切入點方法正常執行之后。它和異常通知只能有一個執行
method:指定通知中方法的名稱。
pointct:定義切入點表達式
pointcut-ref:指定切入點表達式的引用
用于配置后置通知
作用:
屬性:
執行時間點:
<aop:after-returning method="commit" pointcut-ref="pt1"/>
aop:after-throwing
切入點方法執行產生異常后執行。它和后置通知只能執行一個
method:指定通知中方法的名稱。
pointct:定義切入點表達式
pointcut-ref:指定切入點表達式的引用
用于配置異常通知
作用:
屬性:
執行時間點:
<aop:after-throwing method="rollback" pointcut-ref="pt1"/>
aop:after
無論切入點方法執行時是否有異常,它都會在其后面執行。
method:指定通知中方法的名稱。
pointct:定義切入點表達式
pointcut-ref:指定切入點表達式的引用
用于配置最終通知
作用:
屬性:
執行時間點:
<aop:after method="release" pointcut-ref="pt1"/>
execution:匹配方法的執行(常用)
execution(表達式)
表達式語法:execution([修飾符] 返回值類型 包名.類名.方法名(參數))
寫法說明:
全匹配方式:
public void com.itheima.service.impl.AccountServiceImpl.saveAccount(com.itheima.domain.Account)
訪問修飾符可以省略
void com.itheima.service.impl.AccountServiceImpl.saveAccount(com.itheima.domain.Account)
返回值可以使用*號,表示任意返回值
* com.itheima.service.impl.AccountServiceImpl.saveAccount(com.itheima.domain.Account)
包名可以使用*號,表示任意包,但是有幾級包,需要寫幾個*
* *.*.*.*.AccountServiceImpl.saveAccount(com.itheima.domain.Account)
使用..來表示當前包,及其子包
* com..AccountServiceImpl.saveAccount(com.itheima.domain.Account)
類名可以使用*號,表示任意類
* com..*.saveAccount(com.itheima.domain.Account)
方法名可以使用*號,表示任意方法
* com..*.*( com.itheima.domain.Account)
參數列表可以使用*,表示參數可以是任意數據類型,但是必須有參數
* com..*.*(*)
參數列表可以使用..表示有無參數均可,有參數可以是任意類型
* com..*.*(..)
全通配方式:
* *..*.*(..)
注: 通常情況下,我們都是對業務層的方法進行增強,所以切入點表達式都是切到業務層實現類。
execution(* com.itheima.service.impl.*.*(..))
配置方式:
<aop:config> <aop:pointcut expression="execution(* com.itheima.service.impl.*.*(..))" id="pt1"/> <aop:aspect id="txAdvice" ref="txManager"> <!-- 配置環繞通知 --> <aop:around method="transactionAround" pointcut-ref="pt1"/> </aop:aspect> </aop:config>
aop:around:
通常情況下,環繞通知都是獨立使用的
/**
* 環繞通知
* @param pjp
* spring 框架為我們提供了一個接口:ProceedingJoinPoint,它可以作為環繞通知的方法參數。
* 在環繞通知執行時,spring 框架會為我們提供該接口的實現類對象,我們直接使用就行。
* @return
*/
它是 spring 框架為我們提供的一種可以在代碼中手動控制增強代碼什么時候執行的方式。
method:指定通知中方法的名稱。
pointct:定義切入點表達式
pointcut-ref:指定切入點表達式的引用
用于配置環繞通知
作用:
屬性:
說明:
注意:
public Object transactionAround(ProceedingJoinPoint pjp) { //定義返回值 Object rtValue = null; try { //獲取方法執行所需的參數 Object[] args = pjp.getArgs(); //前置通知:開啟事務 beginTransaction(); //執行方法 rtValue = pjp.proceed(args); //后置通知:提交事務 commit(); }catch(Throwable e) { //異常通知:回滾事務 rollback(); e.printStackTrace(); }finally { //最終通知:釋放資源 release(); } return rtValue; }
到此,相信大家對“Java Spring之XML的AOP怎么配置”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。