中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringAOP的介紹和使用方法

發布時間:2021-06-29 15:50:12 來源:億速云 閱讀:145 作者:chen 欄目:大數據

這篇文章主要介紹“SpringAOP的介紹和使用方法”,在日常操作中,相信很多人在SpringAOP的介紹和使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringAOP的介紹和使用方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、AOP介紹

AOP ,面向切面編程,在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。其實就是在代碼運行,進行一定的包裝,如在方法執行前、方法返回后、方法拋出異常后等地方進行一定的攔截處理或者叫增強處理

先講一下AspectJ和Spring AOP關系,網上很多文章對AspectJ存在錯誤說法

AspectJ:

  • AspectJ 來自于 Eclipse 基金會,是Eclipse托管給Apache基金會的一個開源項目

  • 屬于靜態織入,它是通過修改代碼來實現的,它的織入時機可以是:

    • Compile-time weaving:編譯期織入

    • Post-compile weaving:也就是已經生成了 .class 文件,就要用到編譯后織入

    • Load-time weaving:指的是在加載類的時候進行織入

  • AspectJ框架非常強大,它是 AOP 編程的完全解決方案。Spring AOP 致力于解決的是企業級開發中最普遍的 AOP 需求(方法織入)

  • AspectJ 在實際代碼運行前完成了織入,所以大家會說它生成的類是沒有額外運行時開銷的

SpringAOP:

  • 基于動態代理來實現。默認地,如果使用接口的,用 JDK 提供的動態代理實現,如果沒有接口,使用 CGLIB 實現

  • Spring AOP 和AspectJ并沒有什么太多的關系,僅僅是Spring 延用了 AspectJ 中的概念,包括使用了 AspectJ 提供的 jar 包中的注解,但是不依賴于其實現功能

  • Spring AOP 需要依賴于 IOC 容器來管理,只能作用于 Spring 容器中的 Bean,它是使用純粹的 Java 代碼實現的,只能作用于 bean 的方法

  • Spring AOP 比 AspectJ 的性能稍差

二、Spring AOP術語解釋

Joinpoint(連接點)
所謂連接點是指能夠被攔截到的點。在spring中,這些點指的是方法,因為spring只支持方法類型的連接點(任何一個方法都可以稱為連接點)

Pointcut(切入點)
切入點是指我們要對哪些Joinpoint進行攔截的定義(對哪個方法進行增強)

Advice(通知/增強)
通知是指攔截到Joinpoint之后所要做的事情就是通知.通知分為前置通知,后置通知,異常通知,最終通知,環繞通知(切面要完成的功能)(要給它增加什么功能)

Target(目標對象)
代理的目標對象

Weaving(織入)
是指把增強應用到目標對象來創建新的代理對象的過程(怎樣得到代理對象)

Proxy(代理)
一個類被AOP織入增強后,就產生一個結果代理類

Aspect(切面)
是切入點和通知的結合,構成切面,我們可以使用注解或者xml進行配置

三、Spring AOP注解使用

1. 在 xml 中配置
開啟 @AspectJ 的注解,還有其它方式,這里不介紹

<aop:aspectj-autoproxy/>

2. 使用@Aspect注解
定義實現AOP的配置類
@Aspect 注解要作用在 bean 上面

@Component@Aspectpublic class LogAspect {}

3. 配置 Pointcut
用于定義哪些方法需要被增強或者說需要被攔截

    @Pointcut(""execution(* com.ljj.service(..))"")private void controllerAspect() {// TODO Auto-generated method stub}
     @Pointcut("@annotation(com.ljj.annotation.Log)")private void controllerAspect1() {// TODO Auto-generated method stub}@Pointcut(""within(com.ljj.service..*)"")private void controllerAspect2() {// TODO Auto-generated method stub}@Pointcut("bean(*Service)")private void controllerAspect3() {// TODO Auto-generated method stub}
  • execution ,正則匹配方法簽名

  • @annotation。匹配對應注解的方法

  • within,指定所在類或所在包下面的方法

  • bean(idOrNameOfBean), 匹配 bean 的名字

4. 配置 Advice

   @Aspectpublic class AdviceExample {// 下面方法就是寫攔截 "dao層實現"@Before("com.ljj.aop.dataAccessOperation()")public void doAccessCheck() {// ... 實現代碼}@Before("execution(* com.ljj.dao.*.*(..))")public void doAccessCheck() {// ... 實現代碼}@AfterReturning("com.ljj.aop.dataAccessOperation()")public void doAccessCheck() {// ...}@AfterReturning(pointcut="com.ljj.aop.dataAccessOperation()",returning="retVal")public void doAccessCheck(Object retVal) {// 這樣,進來這個方法的處理時候,retVal 就是相應方法的返回值,是不是非常方便// ... 實現代碼}// 異常返回@AfterThrowing("com.ljj.aop.dataAccessOperation()")public void doRecoveryActions() {// ... 實現代碼}@AfterThrowing(pointcut="com.ljj.aop.dataAccessOperation()",throwing="ex")public void doRecoveryActions(DataAccessException ex) {// ... 實現代碼}// 注意理解它和 @AfterReturning 之間的區別,這里會攔截正常返回和異常的情況@After("com.ljj.aop.dataAccessOperation()")public void doReleaseLock() {// 通常就像 finally 塊一樣使用,用來釋放資源。// 無論正常返回還是異常退出,都會被攔截到}// 既能做 @Before 的事情,也可以做 @AfterReturning 的事情@Around("com.ljj.businessService()")public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {// start stopwatchObject retVal = pjp.proceed();// stop stopwatchreturn retVal;}}

上面Advice都已經匹配了對應的PointCut,這樣定義可以不用再定義PointCut了。也可以使用下面這種PointCut + Advice

//定義日志注解@Target({ ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Log {//操作名String optName();//操作類型OperateType optType();//操作表名String optTable();//操作編碼String optCode();
  }


   @Pointcut("@annotation(com.ljj.annotation.Log)")private void controllerAspect() {// TODO Auto-generated method stub}//日志切面@Around("controllerAspect()")public Object around(ProceedingJoinPoint pjp) throws Throwable {   try {   		//方法執行前操作result = point.proceed();//方法執行后操作} catch (Exception e) {e.printStackTrace();}}

到此,關于“SpringAOP的介紹和使用方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安阳市| 万荣县| 广丰县| 紫阳县| 阿荣旗| 绵竹市| 台安县| 嘉鱼县| 福海县| 凉城县| 泰安市| 蒙山县| 六枝特区| 海伦市| 姚安县| 苏尼特右旗| 临湘市| 蕉岭县| 龙门县| 贵溪市| 通州市| 海兴县| 宣化县| 岳池县| 湖北省| 乌审旗| 名山县| 枣庄市| 报价| 稻城县| 诸暨市| 阿合奇县| 云安县| 云和县| 若尔盖县| 湖口县| 澳门| 长葛市| 客服| 万全县| 依安县|