一、概述
spring在此只是使用了和aspectj一樣的註解,但並沒有使用aspectj的編譯器或者織入器,底層依然使用的是spring aop,依然是在執行時動態生成aop**,並不依賴aspectj的編譯器或者織入器。
二、例子與注釋
1、定義aspect與@before增強處理
package com.aspect.service;
//定義乙個介面
public
inte***ce hello
定義乙個切面bean
當啟動@aspect支援後,只要在spring容器配置乙個帶@aspect註解的bean,spring會自動識別該bean,並將該bean作為切面處理
package com.aspect.service;
import org.aspectj.lang.annotation.after;
import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.before;
import org.aspectj.lang.annotation.pointcut;
//定義乙個切面類,用@aspect修飾,表示這個為切入類
@aspect
public
class authaspect
//@before增強處理,指定切入點
@before("select()")
public
void
authority()
@before("select()")
public
void
init()
@after("select()")
public
void
destory()
}目標方法:
package com.aspect.service.impl;
import org.springframework.stereotype.component;
import com.aspect.service.hello;
@component("helloimpl") //注入bean
public
class helloimpl implements hello
public
void
adduser(string name, string pass)
}配置檔案:
base-package="com.aspect.service,com.aspect.service.impl,com.home.bean,com.home.model">
"annotation" expression="org.aspectj.lang.annotation.aspect"/>
"regex" expression=".*teacherconfig"/>
"assignable" expression="org.springframework.context.support.resourcebundlemessagesource"/>
"regex" expression="com.home.model.c*"/>
測試類:
package com.aspect.service.impl;
public
class implhellotest
}輸出如下:
啟動測試
模擬執行許可權檢查
執行hello元件的sayhello()方法
結束測試後
執行hello元件的adduser新增使用者:xieyongxue
模擬方法結束後釋放資源...
2.其他幾個增強處理具體示例
1.before:前置通知(應用:各種校驗)在方法執行前執行,如果通知丟擲異常,阻止方法執行
2.afterreturning:後置通知(應用:常規資料處理)
方法正常返回後執行,如果方法中丟擲異常,通知無法執行
必須在方法執行後才執行,所以可以獲得方法的返回值。
3.around:環繞通知(應用:十分強大,可以做任何事情) 【掌握】
方法執行前後分別執行,可以阻止方法的執行。要求必須手動的執行目標方法。
4.afterthrowing:丟擲異常通知(應用:包裝異常資訊)
方法丟擲異常後執行,如果方法沒有丟擲異常,無法執行
5.after:最終通知(應用:清理現場)
方法執行完畢後執行,無論方法中是否出現異常
package com.aspect.service;
import org.aspectj.lang.annotation.after;
import org.aspectj.lang.annotation.afterreturning;
import org.aspectj.lang.annotation.afterthrowing;
import org.aspectj.lang.annotation.aspect;
@aspect
public
class
logaspect
@afterthrowing(throwing="ex",pointcut="execution(* *.adduser(..))")
public
void
throwmsg(throwable ex)
@after("execution(* *.adduser(..))")
public
void
release()
}package com.aspect.service;
import org.aspectj.lang.proceedingjoinpoint;
import org.aspectj.lang.annotation.around;
import org.aspectj.lang.annotation.aspect;
@aspect
public
class
txaspect
//以改變後的引數去執行目標方法,並儲存目標方法執行後的引數
object rvt=jp.proceed(args);
system.out.println("執行目標方法後,模擬結束事務。。。。");
//如果rvt的型別是integer,將rvt改為它的平方,用於改變目標方法的返回值
if(rvt!=null && rvt instanceof integer)
return rvt;
}}package com.aspect.service.impl;
import org.springframework.stereotype.component;
import com.aspect.service.hello;
@component
public
class
world
implements
hello
public
void
adduser(string name, string pass)
}public
intadduser(int rvt)
return rvt;
}public
intaddpersons(int rvt)
}測試類:
package com.aspect.service.impl;
public
class
worldtest
}輸出:
執行帶返回值的adduser方法:20
獲取目標方法返回值:20
模擬記錄日誌功能...
模擬方法結束後釋放資源...
執行hello元件的adduser的方法
模擬方法結束後釋放資源...
執行目標方法之前開始模式事務....
執行帶返回值的addperson()方法:20
執行目標方法後,模擬結束事務。。。。
執行目標方法之前開始模式事務....
執行帶返回值的addperson()方法:20
執行目標方法後,模擬結束事務。。。。
addpersons的返回值為:400
spring 基於註解的spring配置
spring是乙個基於ioc和aop的結構j2ee系統的框架 ioc 反轉控制 是spring的基礎,inversion of control 簡單說就是建立物件由以前的程式設計師自己new 構造方法來呼叫,變成了交由spring建立物件 di 依賴注入 dependency inject.簡單地說...
基於註解配置spring
1 對 bean 的標註基於註解方式有3個註解 2 想要 spring 獲得基於註解的bean 需要配置 進行掃瞄,並從註解中獲得配置資訊。3 自動裝配 bean 使用 autowired 註解實現 bean 的依賴注入。autowired 預設按照型別匹配 bytype 的方式在容器中查詢匹配的b...
Spring 基於註解的配置
從 spring 2.5 開始就可以使用註解來配置依賴注入。而不是採用 xml 來描述乙個 bean 連線,你可以使用相關類,方法或字段宣告的註解,將 bean 配置移動到元件類本身。在 xml 注入之前進行註解注入,因此後者的配置將通過兩種方式的屬性連線被前者重寫。註解連線在預設情況下在 spri...