spring之a(chǎn)op配置與springboot aop配置

spring的面向切面編程坚嗜,即aop編程是有3種作用的:

- 日志記錄

- 安全驗證

- 數(shù)據(jù)庫事務(wù)管理

這里簡單的先講述下日志的記錄體現(xiàn)卷胯。

1.spring的aop配置有基于注解和xml2種,為了方便演示,這里用上次ssm搭建代碼來演示缎除,代碼地址https://gitee.com/cyy2csy/ssm。

(1)基于xml的spring aop配置

? ? 新建包Aspect总寻,在下面新建織入類LoggingAspect:

package com.cyy.maven.core.Aspect;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.*;

/**

* @Author: Cyy

* @Description: 織入類

* @Date:Created in 16:00 2018/7/22

*/

@Slf4j

public class LoggingAspect {

? ? public void beforeMethod(JoinPoint joinPoint){

? ? String methodName = joinPoint.getSignature().getName();

? ? ? ? Object [] args = joinPoint.getArgs();

? ? ? ?log.info("The method={} begins with={}",methodName,Arrays.asList(args));

? ? }

public void afterMethod(JoinPoint joinPoint){

? ? String methodName = joinPoint.getSignature().getName();

? ? log.info("The method={} ends",methodName);

? ? }

? public void afterReturning(JoinPoint joinPoint, Object result){

? ? String methodName = joinPoint.getSignature().getName();

? ? ? ?log.info("The method={},ends with={}",methodName,result);

? ? }

public void afterThrowing(JoinPoint joinPoint, Exception e){

? ? String methodName = joinPoint.getSignature().getName();

????? log.error("The method={},occurs excetion:={}",methodName,e);

? ? }

? public Object aroundMethod(ProceedingJoinPoint pjd){

? ? Object result =null;

? ? ? ? String methodName = pjd.getSignature().getName();

? ? ? ? try {

????????????//前置通知

? ? ? ? ? log.info("The method={},begins with={}", methodName, Arrays.asList(pjd.getArgs()));

? ? ? ? ? ? //執(zhí)行目標方法

? ? ? ? ? ? result = pjd.proceed();

? ? ? ? ? ? //返回通知

? ? ? ? ? log.info("The method={},ends with={}",methodName ,result);

? ? ? ? }catch (Throwable e) {

????????????//異常通知

? ? ? ? ? ?log.error("The method={},occurs exception:={}",methodName,e);

? ? ? ? ? ? throw new RuntimeException(e);

? ? ? ? }

//后置通知

? ? ? ?log.info("The method={},ends",methodName);

? ? ? ? return result;

? ? }

}

在spring的配置文件spring-context.xml中配置基于aop的事務(wù)增強梢为。

<bean id="loggingAspect" class="com.cyy.maven.core.Aspect.LoggingAspect"/>

<aop:config>

<aop:pointcut id="serviceOpearation" expression="execution(* com.cyy.maven.core.service.impl.*.*(..))"/>

<aop:aspect ref="loggingAspect">

? ? <aop:before method="beforeMethod" pointcut-ref="serviceOpearation"/>

? ? <aop:after method="afterMethod" pointcut-ref="serviceOpearation"/>

? ? <aop:after-returning method="afterReturning" pointcut-ref="serviceOpearation" returning="result"/>

? ? <aop:after-throwing method="afterThrowing" pointcut-ref="serviceOpearation" throwing="e"/>

</aop:aspect>

<!--<aop:advisor advice-ref=""/>-->

</aop:config>

測試結(jié)果:

beforeMethod


afterMethod&afterReturning

在spring-context.xml中其實可以直接配置<aop:around method="aroundMethod" pointcut-ref="serviceOpearation"/>環(huán)繞通知渐行,等價于前面3個辦法的功能。

(2)基于注解的spring aop配置

LoggingAspect的配置改為如下:

package com.cyy.maven.core.Aspect;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

import java.util.Arrays;

/**

* @Author: Cyy

* @Description:

* @Date:Created in 16:00 2018/7/22

*/

@Slf4j

@Aspect

@Component

public class LoggingAspect {

@Pointcut("execution(* com.cyy.maven.core.service.impl.*.*(..))")

private void log(){}

@Before("log()")

public void beforeMethod(JoinPoint joinPoint){

String methodName = joinPoint.getSignature().getName();

? ? ? ? Object [] args = joinPoint.getArgs();

?????????log.info("The method={},begins with={}",methodName,Arrays.asList(args));

? ? }

@After("log()")

public void afterMethod(JoinPoint joinPoint){

String methodName = joinPoint.getSignature().getName();

? ? ? ? log.info("The method={},ends",methodName);

? ? }

@AfterReturning(pointcut ="log()",returning ="result")

public void afterReturning(JoinPoint joinPoint, Object result){

String methodName = joinPoint.getSignature().getName();

? ? ? log.info("The method={},ends with={}",methodName,result);

? ? }

@AfterThrowing(pointcut ="log()",throwing ="e")

public void afterThrowing(JoinPoint joinPoint, Exception e){

String methodName = joinPoint.getSignature().getName();

? ? ? ?log.error("The method={},occurs excetion:={}",methodName,e);

? ? }

//? ? @Around("log()")

? ? public ObjectaroundMethod(ProceedingJoinPoint pjd){

Object result =null;

? ? ? ? String methodName = pjd.getSignature().getName();

? ? ? ? try {

//前置通知

? ? ? ? ? ?log.info("The method={},begins with={}", methodName, Arrays.asList(pjd.getArgs()));

? ? ? ? ? ? //執(zhí)行目標方法

? ? ? ? ? ? result = pjd.proceed();

? ? ? ? ? ? //返回通知

? ? ? ? ? ?log.info("The method={},ends with={}",methodName ,result);

? ? ? ? }catch (Throwable e) {

//異常通知

? ? ? ? ? ? log.error("The method={}铸董,occurs exception:={}",methodName,e);

? ? ? ? ? ? throw new RuntimeException(e);

? ? ? ? }

//后置通知

? ? ? log.info("The method={},ends",methodName);

? ? ? ? return result;

? ? }

}


spring配置文件spring-context.xml的配置如下:

<!-- 配置自動掃描-->

<context:component-scan base-package="com.cyy.maven.core.Aspect"/>

<!--告訴JVM 我們用了aspectj的 annotation -->

<aop:aspectj-autoproxy/>

測試結(jié)果如圖:


beforeMethod


afterMethod&afterReturning

在aroundMethod加上@Around("log()")祟印,注釋掉其他的注解,可以實現(xiàn)相同的功能粟害。

2.springboot的aop配置不用基于xml蕴忆,是完全基于注解的配置,和spring的注解配置很相似悲幅。

這里也直接用以前搭建的springboot框架來測試套鹅,碼云地址為https://gitee.com/cyy2csy/girl.git。

新建Aspect包汰具,下面新建HttpAspect織入類:

package com.cyy.Aspect;

import lombok.extern.slf4j.Slf4j;

import org.apache.catalina.servlet4preview.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;

@Slf4j

@Aspect

@Component

public class HttpAspect {

@Pointcut("execution(public * com.cyy.controller.GirlController.*(..))")

public void log(){}

@Before("log()")

public void doBefore(JoinPoint joinPoint){

ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

? ? ? ? HttpServletRequest request= (HttpServletRequest) attributes.getRequest();

? ? ? ? log.info("執(zhí)行事務(wù)之前卓鹿。。留荔。");

? ? ? ? log.info("url={}",request.getRequestURI());

? ? ? ? log.info("method={}",request.getMethod());

? ? ? ? log.info("ip={}",request.getRemoteAddr());

? ? ? ? log.info("class-method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());

? ? ? ? log.info("args={}",joinPoint.getArgs());

? ? }

@After("log()")

public void doAfter(){

log.info("執(zhí)行事務(wù)之后吟孙。。聚蝶。");

? ? }

@AfterReturning(returning ="object", pointcut ="log()")

public void doAfterReturning(Object object) {

log.info("response={}", object.toString());

? ? }

@AfterThrowing(pointcut ="log()",throwing ="e")

public void afterThrowing(JoinPoint joinPoint, Exception e){

String methodName = joinPoint.getSignature().getName();

? ? ? log.info("The method={}" + methodName +" occurs excetion:={}" + e);

? ? }

//? ? @Around("log()")

? ? public ObjectaroundMethod(ProceedingJoinPoint pjd){

Object object =null;

? ? ? ? String methodName = pjd.getSignature().getName();

? ? ? ? try {

//前置通知

? ? ? ? ? ? ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

? ? ? ? ? ? HttpServletRequest request= (HttpServletRequest) attributes.getRequest();

? ? ? ? ? ? log.info("執(zhí)行事務(wù)之前杰妓。。碘勉。");

? ? ? ? ? ? log.info("url={}",request.getRequestURI());

? ? ? ? ? ? log.info("method={}",request.getMethod());

? ? ? ? ? ? log.info("ip={}",request.getRemoteAddr());

? ? ? ? ? ? log.info("class-method={}",pjd.getSignature().getDeclaringTypeName()+"."+pjd.getSignature().getName());

? ? ? ? ? ? log.info("args={}",pjd.getArgs());

? ? ? ? ? ? //執(zhí)行目標方法

? ? ? ? ? ? object = pjd.proceed();

? ? ? ? ? ? //返回通知

? ? ? ? ? ? log.info("response={}", object.toString());

? ? ? ? }catch (Throwable e) {

//異常通知

? ? ? ? ? log.info("The method={},occurs exception:={}",methodName,e);

? ? ? ? ? ? throw new RuntimeException(e);

? ? ? ? }

//后置通知

? ? ? ? log.info("執(zhí)行事務(wù)之后巷挥。。恰聘。");

? ? ? ? return object;

? ? }

}

測試結(jié)果:

同樣的句各,?將@Around("log()")加上吸占,將其他注解注釋掉,運行也是同樣的結(jié)果凿宾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矾屯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子初厚,更是在濱河造成了極大的恐慌件蚕,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件产禾,死亡現(xiàn)場離奇詭異排作,居然都是意外死亡,警方通過查閱死者的電腦和手機亚情,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門妄痪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人楞件,你說我怎么就攤上這事衫生。” “怎么了土浸?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵罪针,是天一觀的道長。 經(jīng)常有香客問我黄伊,道長泪酱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任还最,我火速辦了婚禮墓阀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拓轻。我一直安慰自己岂津,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布悦即。 她就那樣靜靜地躺著吮成,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辜梳。 梳的紋絲不亂的頭發(fā)上粱甫,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音作瞄,去河邊找鬼茶宵。 笑死,一個胖子當著我的面吹牛宗挥,可吹牛的內(nèi)容都是我干的乌庶。 我是一名探鬼主播种蝶,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞒大!你這毒婦竟也來了螃征?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤透敌,失蹤者是張志新(化名)和其女友劉穎盯滚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酗电,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡魄藕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撵术。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片背率。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嫩与,靈堂內(nèi)的尸體忽然破棺而出退渗,到底是詐尸還是另有隱情,我是刑警寧澤蕴纳,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站个粱,受9級特大地震影響古毛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜都许,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一稻薇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胶征,春花似錦塞椎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钱雷,卻和暖如春骂铁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罩抗。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工拉庵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人套蒂。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓钞支,卻偏偏與公主長得像茫蛹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烁挟,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容