日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring AOP 切面@Around注解的用法說明

瀏覽:130日期:2023-07-23 08:40:06

@Around注解可以用來在調(diào)用一個具體方法前和調(diào)用后來完成一些具體的任務(wù)。

比如我們想在執(zhí)行controller中方法前打印出請求參數(shù),并在方法執(zhí)行結(jié)束后來打印出響應(yīng)值,這個時候,我們就可以借助于@Around注解來實現(xiàn);

再比如我們想在執(zhí)行方法時動態(tài)修改參數(shù)值等

類似功能的注解還有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于攔截器、事務(wù)、日志、權(quán)限驗證等方面。

完整演示代碼如下:

需要說明的是,在以下例子中,我們即可以只用@Around注解,并設(shè)置條件,見方法run1();也可以用@Pointcut和@Around聯(lián)合注解,見方法pointCut2()和run2(),這2種用法是等價的。如果我們還想利用其進行參數(shù)的修改,則調(diào)用時必須用joinPoint.proceed(Object[] args)方法,將修改后的參數(shù)進行回傳。如果用joinPoint.proceed()方法,則修改后的參數(shù)并不會真正被使用。

import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component; import javax.persistence.EntityManager; /** * 控制器切面 * * @author lichuang */ @Component@Aspectpublic class ControllerAspect { private static final Logger logger = LoggerFactory.getLogger(ControllerAspect.class); @Autowired private EntityManager entityManager; /** * 調(diào)用controller包下的任意類的任意方法時均會調(diào)用此方法 */ @Around('execution(* com.company.controller.*.*(..))') public Object run1(ProceedingJoinPoint joinPoint) throws Throwable { //獲取方法參數(shù)值數(shù)組 Object[] args = joinPoint.getArgs(); //得到其方法簽名 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); //獲取方法參數(shù)類型數(shù)組 Class[] paramTypeArray = methodSignature.getParameterTypes(); if (EntityManager.class.isAssignableFrom(paramTypeArray[paramTypeArray.length - 1])) { //如果方法的參數(shù)列表最后一個參數(shù)是entityManager類型,則給其賦值 args[args.length - 1] = entityManager; } logger.info('請求參數(shù)為{}',args); //動態(tài)修改其參數(shù) //注意,如果調(diào)用joinPoint.proceed()方法,則修改的參數(shù)值不會生效,必須調(diào)用joinPoint.proceed(Object[] args) Object result = joinPoint.proceed(args); logger.info('響應(yīng)結(jié)果為{}',result); //如果這里不返回result,則目標對象實際返回值會被置為null return result; } @Pointcut('execution(* com.company.controller.*.*(..))') public void pointCut2() {} @Around('pointCut2()') public Object run2(ProceedingJoinPoint joinPoint) throws Throwable { //獲取方法參數(shù)值數(shù)組 Object[] args = joinPoint.getArgs(); //得到其方法簽名 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); //獲取方法參數(shù)類型數(shù)組 Class[] paramTypeArray = methodSignature.getParameterTypes(); if (EntityManager.class.isAssignableFrom(paramTypeArray[paramTypeArray.length - 1])) { //如果方法的參數(shù)列表最后一個參數(shù)是entityManager類型,則給其賦值 args[args.length - 1] = entityManager; } logger.info('請求參數(shù)為{}',args); //動態(tài)修改其參數(shù) //注意,如果調(diào)用joinPoint.proceed()方法,則修改的參數(shù)值不會生效,必須調(diào)用joinPoint.proceed(Object[] args) Object result = joinPoint.proceed(args); logger.info('響應(yīng)結(jié)果為{}',result); //如果這里不返回result,則目標對象實際返回值會被置為null return result; }}

補充:Spring Aop實例(AOP 如此簡單)@Aspect、@Around 注解方式配置

IoC相關(guān)的基本內(nèi)容告一段落,本次介紹Spring的第二個特性,AOP,面向切面編程,術(shù)語聽起來比較不容易理解,沒關(guān)系,一切盡在實例中,讓我們看一個簡單的實例,就能明白。

實例

項目工程目錄結(jié)構(gòu)和代碼獲取地址

獲取地址(版本Log將會注明每一個版本對應(yīng)的課程)

https://github.com/laiyijie/SpringLearning

目錄結(jié)構(gòu)

Spring AOP 切面@Around注解的用法說明

運行工程

運行具有Main函數(shù)的 App.java

得到如下輸出

method start time:1480223298250userHellomethod end time:1480223299250項目詳解

從App.java入手

App.java

package me.laiyijie.demo;import org.springframework.context.support.ClassPathXmlApplicationContext;import me.laiyijie.demo.service.HelloInterface;public class App { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext('root-context.xml'); HelloInterface userService = context.getBean(HelloInterface.class); userService.sayHello(); context.close(); }}

調(diào)用的是HelloInterface的sayHello方法

HelloInterface.java

package me.laiyijie.demo.service;public interface HelloInterface{ void sayHello(); }

其實現(xiàn)類為UserServiceImpl.java

UserServiceImpl.java

package me.laiyijie.demo.service;import org.springframework.stereotype.Service;@Servicepublic class UserServiceImpl implements HelloInterface { public void sayHello() { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println('userHello'); } }

誒?情況跟我們看到的代碼有出入?

sayHello 應(yīng)該只輸出 userHello,前后兩行輸出從何出現(xiàn)?

在Main函數(shù)中找不到一點兒線索!

這就是AOP的一個強大特性:

無侵入性,不改變原有的代碼,卻能增加功能!

那么究竟是如何增加功能的呢?

讓我們看看TimeMonitor.java

TimeMonitor.java

package me.laiyijie.demo.aop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Service;@Service@Aspectpublic class TimeMonitor { @Around('execution(* me.laiyijie.demo.service.UserServiceImpl.sayHello(..))') public void monitorAround(ProceedingJoinPoint pjp) throws Throwable { System.out.println('method start time:' + System.currentTimeMillis()); Object re = pjp.proceed(); System.out.println('method end time:' + System.currentTimeMillis()); }}

終于看到了 method start time:1480223298250 和 method end time:1480223299250這兩行輸出是從哪兒出現(xiàn)的了!

讓我們來仔細解讀一下這個類

類有兩個注釋,分別是@Service和@Aspect,第一個注解是使得TimeMonitor受Spring托管并實例化。@Aspect就是使得這個類具有AOP功能(你可以這樣理解)兩個注解缺一不可

類里面只有一個方法,名字叫做monitorAroud,其實就是為了檢測函數(shù)執(zhí)行時間的!

那么關(guān)鍵點來了,兩個輸出語句是怎么插入到sayHello方法的前后的呢!

看這個注解:

@Around('execution(* me.laiyijie.demo.service.UserServiceImpl.sayHello(..))')

@Around表示包圍一個函數(shù),也就是可以在函數(shù)執(zhí)行前做一些事情,也可以在函數(shù)執(zhí)行后做一些事情

execution(* me.laiyijie.demo.service.UserServiceImpl.sayHello(..))

這個比較好理解,就是使用表達式的方式指定了要對哪個函數(shù)進行包圍!(除了execution以外還有很多,可以搜索AspectJ語法來學(xué)習(xí))

也就是說,這個注解完整的說明了,應(yīng)該在函數(shù)的什么位置插入變化,也就是所謂的切點

之后是函數(shù)的定義:

public Object monitorAround(ProceedingJoinPoint pjp)

這里引入了ProceedingJoinPoint,在使用了@Around之后可以帶入這個參數(shù),代表的其實就是sayHello這個函數(shù),不過做了一些封裝

而 Object re = pjp.proceed(); 就是相當于執(zhí)行了 sayHello方法!

剩下的代碼就不用過多解釋了,就是在執(zhí)行這個函數(shù)的前后分別進行了系統(tǒng)時間的獲取。

我們把這個函數(shù)體,也就是定義了要做那些事情的代碼,稱作增強

而包含切點和增強結(jié)合起來就稱作切面

面向切面由此而來!

Spring AOP 開啟需要的配置

需要配置兩項

1、pom.xml增加依賴(因為要用到AOP還需要不同的JAR包)

2、root-context.xml中增加切面相關(guān)配置

root-context.xml

<?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:context='http://www.springframework.org/schema/context' 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/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd'> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <context:component-scan base-package='me.laiyijie.demo'></context:component-scan></beans>

root-context.xml 增加了兩行

1、xmlns:aop='http://www.springframework.org/schema/aop'

代表加入命名空間

2、<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

使用1中引入的aop命名空間開起自動代理(自動代理具體含義后續(xù)慢慢解釋,簡單的理解就是AOP的實現(xiàn)是依靠自動代理實現(xiàn)的)

pom.xml

<project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'> <modelVersion>4.0.0</modelVersion> <groupId>me.laiyijie</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.9</version> </dependency> </dependencies></project>

增加了一個依賴

AspectJ 一個強大的AOP框架,也就是@Aspect和@Around以及ProceedingJoinPoint這些注解和方法的提供者

小結(jié)

增強:定義了應(yīng)該怎么把額外的動作加入到指定函數(shù)中

切點:定義了你應(yīng)該把增強插入到哪個函數(shù)的什么位置

切面:切點和增強組合起來的稱呼

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
另类av一区二区| 91成人精品| 婷婷久久免费视频| 日本不卡视频在线观看| 91成人在线精品视频| 国产精品网在线观看| 国产精品毛片aⅴ一区二区三区| 久久99青青| 精品久久网站| 黑人精品一区| 私拍精品福利视频在线一区| 红桃视频欧美| 日韩一区二区三区精品| 久久99精品久久久久久园产越南| 视频在线不卡免费观看| 91九色精品| 亚洲欧洲免费| 老司机免费视频一区二区| 日韩欧美视频专区| 最新国产精品视频| 欧美激情五月| 欧美/亚洲一区| 日本视频中文字幕一区二区三区| 蜜桃精品视频| 婷婷综合激情| 亚洲一级淫片| 精品丝袜久久| 欧美精品羞羞答答| 国产亚洲高清一区| 激情欧美一区二区三区| 日韩国产高清在线| www.九色在线| 日韩精品中文字幕吗一区二区| 成人国产精品久久| 在线看片一区| 黄毛片在线观看| 日韩一区免费| 99精品在线| 国产精品99精品一区二区三区∴| 99精品电影| 日本免费一区二区视频| 欧洲精品一区二区三区| 日韩精品国产精品| 日韩一区电影| 久久精品72免费观看| 欧美精品一区二区三区精品| 91精品美女| 午夜欧美在线| 久久亚州av| 亚洲综合小说| 免费久久精品| 国产精品www994| 免费视频久久| 久久婷婷激情| 久久在线91| 亚洲区第一页| 国产一在线精品一区在线观看| 国产欧美一区二区三区米奇| 91精品二区| 精品国产一区二区三区2021| 亚洲精选成人| 在线午夜精品| 色天使综合视频| 久久福利在线| 亚洲精品伊人| 日韩视频一区| 色爱综合av| 精品日产乱码久久久久久仙踪林| 中文字幕一区二区三区四区久久 | 日韩中出av| 天堂资源在线亚洲| 国产一区二区三区国产精品| 国产日韩欧美高清免费| 亚洲麻豆一区| 麻豆9191精品国产| 欧美日韩激情| 久久九九电影| 精品成人免费一区二区在线播放| 国产精品久久久久av蜜臀| 蜜桃视频免费观看一区| 精品一区免费| 国产精品久久观看| 免费看久久久| 国产精品久久亚洲不卡| 91免费精品国偷自产在线在线| 六月天综合网| 美国三级日本三级久久99 | 美女视频免费精品| 日韩高清一区二区| 亚洲日本三级| 中文字幕成人| 日韩在线a电影| 免费久久精品视频| 少妇精品久久久| 日韩高清一区| 欧美日本三区| 国产精品手机在线播放| 日韩国产在线不卡视频| 综合一区av| 亚洲三级网站| 日本成人在线网站| 国产一卡不卡| 国产激情久久| 国产一区不卡| 久久久9色精品国产一区二区三区| 成人精品中文字幕| 欧美日韩视频免费观看| 欧美天堂视频| 久久精品青草| 久久福利一区| 91大神在线观看线路一区| 91欧美精品| 国产福利一区二区精品秒拍 | 日韩高清二区| 国产精品亚洲综合在线观看| 免费在线亚洲欧美| 欧美国产偷国产精品三区| 日韩欧美一区免费| 亚洲激情中文在线| 久久不射网站| 欧美影院精品| 极品av在线| 在线一区视频| 日本欧美一区二区在线观看| 久久久久观看| 久久香蕉国产| 亚洲精品第一| 精品久久久久久久| 久久亚洲国产| 亚洲影视一区二区三区| 欧美成a人片免费观看久久五月天| 久久久久亚洲精品中文字幕| 色偷偷偷在线视频播放| 亚洲免费高清| 日韩精品免费视频一区二区三区| 日本午夜精品一区二区三区电影| 久久精品亚洲| 黄色av一区| 国产精品一区二区av日韩在线| 成人在线视频中文字幕| 日韩一级网站| 精品资源在线| 国产视频一区三区| 另类欧美日韩国产在线| 99免费精品| 日本免费在线视频不卡一不卡二| аⅴ资源天堂资源库在线| 久久亚洲图片| а√天堂中文在线资源8| 国产精品色网| 国产精品草草| 亚洲激情欧美| 开心激情综合| 99视频精品免费观看| 国产精品地址| 亚洲黄页一区| 久久wwww| 丝袜a∨在线一区二区三区不卡| 久久字幕精品一区| 视频在线观看一区| 日韩欧美视频专区| 欧美精品观看| 美女日韩在线中文字幕| 中文在线а√在线8| 亚洲乱码一区| 欧美aa在线观看| 欧美在线黄色| 噜噜噜躁狠狠躁狠狠精品视频| 丁香婷婷久久| 欧美亚洲三区| 三级一区在线视频先锋| 日韩影院二区| 欧美激情精品| 青草av.久久免费一区| 红桃视频欧美| 日韩国产一区| 欧美黑人做爰爽爽爽| 免播放器亚洲一区| 久久亚洲国产| 久久精品国产福利| 日本欧美大码aⅴ在线播放| 在线亚洲国产精品网站| 成人va天堂| 久久电影tv| 国产极品久久久久久久久波多结野| 视频在线观看91| 红桃视频欧美| 2023国产精品久久久精品双| 亚洲深夜视频| 成人一区不卡| 福利欧美精品在线| 久久精品国产99| 国产精品一区二区av交换| 亚洲精品乱码| 婷婷亚洲五月色综合| 日韩三区在线| 久久婷婷av| av一区在线| 久久久久一区| 色88888久久久久久影院|