Spring框架AOP核心詳解

2020-12-19 計算機java編程

AOP稱為面向切面編程,在程序開發中主要用來解決一些系統層面上的問題,比如日誌,事務,權限等待,Struts2的攔截器設計就是基於AOP的思想,是個比較經典的例子。

一 AOP的基本概念

(1)Aspect(切面):通常是一個類,裡面可以定義切入點和通知

(2)JointPoint(連接點):程序執行過程中明確的點,一般是方法的調用

(3)Advice(通知):AOP在特定的切入點上執行的增強處理,有before,after,afterReturning,afterThrowing,around

(4)Pointcut(切入點):就是帶有通知的連接點,在程序中主要體現為書寫切入點表達式

(5)AOP代理:AOP框架創建的對象,代理就是目標對象的加強。Spring中的AOP代理可以使JDK動態代理,也可以是CGLIB代理,前者基於接口,後者基於子類

二 Spring AOP

Spring中的AOP代理還是離不開Spring的IOC容器,代理的生成,管理及其依賴關係都是由IOC容器負責,Spring默認使用JDK動態代理,在需要代理類而不是代理接口的時候,Spring會自動切換為使用CGLIB代理,不過現在的項目都是面向接口編程,所以JDK動態代理相對來說用的還是多一些。

三 基於註解的AOP配置方式

1.啟用@AsjectJ支持

在applicationContext.xml中配置下面一句:

2.通知類型介紹

(1)Before:在目標方法被調用之前做增強處理,@Before只需要指定切入點表達式即可

(2)AfterReturning:在目標方法正常完成後做增強,@AfterReturning除了指定切入點表達式後,還可以指定一個返回值形參名returning,代表目標方法的返回值

(3)AfterThrowing:主要用來處理程序中未處理的異常,@AfterThrowing除了指定切入點表達式後,還可以指定一個throwing的返回值形參名,可以通過該形參名

來訪問目標方法中所拋出的異常對象

(4)After:在目標方法完成之後做增強,無論目標方法時候成功完成。@After可以指定一個切入點表達式

(5)Around:環繞通知,在目標方法完成前後做增強處理,環繞通知是最重要的通知類型,像事務,日誌等都是環繞通知,注意編程中核心是一個ProceedingJoinPoint

3.例子:

(1)Operator.java --> 切面類

(2)UserService.java --> 定義一些目標方法

(3).applicationContext.xml

(4).Test.java

上面是一個比較簡單的測試,基本涵蓋了各種增強定義。注意:做環繞通知的時候,調用ProceedingJoinPoint的proceed()方法才會執行目標方法。

4.通知執行的優先級

進入目標方法時,先織入Around,再織入Before,退出目標方法時,先織入Around,再織入AfterReturning,最後才織入After。

注意:Spring AOP的環繞通知會影響到AfterThrowing通知的運行,不要同時使用!同時使用也沒啥意義。

5.切入點的定義和表達式

切入點表達式的定義算是整個AOP中的核心,有一套自己的規範

Spring AOP支持的切入點指示符:

(1)execution:用來匹配執行方法的連接點

A:@Pointcut("execution(* com.aijava.springcode.service..*.*(..))")

第一個*表示匹配任意的方法返回值,..(兩個點)表示零個或多個,上面的第一個..表示service包及其子包,第二個*表示所有類,第三個*表示所有方法,第二個..表示

方法的任意參數個數

B:@Pointcut("within(com.aijava.springcode.service.*)")

within限定匹配方法的連接點,上面的就是表示匹配service包下的任意連接點

C:@Pointcut("this(com.aijava.springcode.service.UserService)")

this用來限定AOP代理必須是指定類型的實例,如上,指定了一個特定的實例,就是UserService

D:@Pointcut("bean(userService)")

bean也是非常常用的,bean可以指定IOC容器中的bean的名稱

後言: spring 的環繞通知和前置通知,後置通知有著很大的區別,主要有兩個重要的區別:

1) 目標方法的調用由環繞通知決定,即你可以決定是否調用目標方法,而前置和後置通知 是不能決定的,他們只是在方法的調用前後執行通知而已,即目標方法肯定是要執行的。

2) 環繞通知可以控制返回對象,即你可以返回一個與目標對象完全不同的返回值,雖然這很危險,但是你卻可以辦到。而後置方法是無法辦到的,因為他是在目標方法返回值後調用

6.基於XML形式的配置方式

開發中如果選用XML配置方式,通常就是POJO+XML來開發AOP,大同小異,無非就是在XML文件中寫切入點表達式和通知類型

例子:

(1)Log.java

(2).Logger.java

(3).applicationContext.xml

注意切入點表達式,!bean(logService) 做日誌通知的時候,不要給日誌本身做日誌,否則會造成無限循環!

有關更詳細的Spring AOP知識,可以查看Spring官方文檔第9章Aspect Oriented Programming with Spring

7.JDK動態代理介紹

例子:

(1)UserService.java

(2)UserServiceImpl.java

(3)ProxyUtils.java

(4)Test.java

JDK動態代理核心還是一個InvocationHandler,記住這個就行了。

相關焦點

  • 詳解Spring框架的AOP機制
    2、 實現AOP案例代碼在實現AOP案例之前,需要確定項目已經引入了Spring框架關於AOP功能的Jar包。下面列出的是spring-aop-5.0版本,其它版本也可以。● spring-aop-5.0.8.RELEASE● spring-aspects-5.0.8.RELEASE另外還需要引入下面的Jar包:● aspectjrt● aspectjweaver
  • 如何理解 Spring AOP 以及使用 AspectJ?
    能夠使開發人員在編寫業務邏輯時專注於核心業務邏輯,而不用過度的關注與其他業務邏輯的實現。這樣可以提高開發效率,同時還增強了代碼的可維護性。目前主流的AOP 框架有2個,分別是spring aop 和aspectJ,前者是純Java 實現的,不需要專門的編譯過程和類加載器,在運行期間可以通過代理的方式向目標內植入增強的代碼。
  • Spring 框架之 AOP 原理深度剖析!|CSDN 博文精選
    作者 | GitChat責編 | 郭芮出品 | CSDN 博客AOP(Aspect Oriented Programming)面向切面編程是 Spring 框架最核心的組件之一,它通過對程序結構的另一種考慮,補充了 OOP
  • 輕輕鬆鬆看懂Spring AOP源碼
    如果對spring的核心容器和JDK動態代理、CGLIB有所了解,接下來再看spring AOP源碼會比較容易。文中所有代碼片段截圖對應的spring版本是5.0。本文內容曾首發於頭條。首先來看個問題,spring在哪裡使用了AOP?spring 實現AOP代碼的源頭在哪裡?
  • spring AOP是什麼?你都拿它做什麼?
    4.spring AOP原理及實戰。 前文提到jdk代理和cglib代理兩種動態代理,優秀的spring框架把兩種方式在底層都集成了進去,我們無需擔心自己去實現動態生成代理。那麼,spring是如何生成代理對象的?: 1.創建容器對象的時候,根據切入點表達式攔截的類,生成代理對象。 2.如果目標對象有實現接口,使用jdk代理。
  • spring原理詳解,兩大核心IOC和AOP
    1.概念:spring是輕量級的開發框架;兩大核心IOC和AOP;包含完成特定功能的子框架。2.特點:簡化開發過程;解耦;集成第三方框架一、Spring容器Spring框架中的一個核心模塊,用來管理對象(包括對象的創建、銷毀、對象之間的依賴關係的 建立等等)。
  • 面試被問spring的aop的機制,這樣答
    參加過面試的或者是準備要參加面試在刷面試題的小夥伴,肯定遇到過「spring的aop的機制是什麼?」這個問題。刷過面試題的小夥伴肯定要說了,aop的機制是代理啊。那代理又是怎麼回事呢?下面我來給大家說說這個代理是怎麼回事,怎麼就能實現aop了。先來說說代理這個詞,你都聽過哪些代理相關的詞呢?房產代理?保險代理?代理商?
  • Spring學習筆記,菜鳥程序猿必看,一篇文章讓你摸透Spring
    對編程感興趣的可以私信我獲取資料,或者點擊編程技術交流學習來與我面對面交流Spring介紹Spring 是一個開源框架,是一個分層的 JavaEE 一站式框架。所謂一站式框架是指 Spring 有 JavaEE 開發的每一層解決方案。
  • Java程式設計師必須要知道的Spring框架經典面試題
    spring現在Java的主流框架非Spring莫屬,Spring興起於2003年,spring最初的想法是想讓JAVA EE開發應該更加簡單,為JavaBean提供了一個更好的應用配置框架那麼經歷了10幾年的框架,已經成為了Java的主流框架,並且也有Spring自己體系。面對10幾年主流開發框架,必須要知道的Spring框架面試題你了解多少呢?
  • Spring框架IoC核心詳解
    這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制對象的生命周期和對象間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷毀都由spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。
  • Java程式設計師必會 springmvc-spring-mybatis框架整合搭建傻瓜教程
    ssm是用於將springmvc-spring-mybatis三個框架整合來進行java開發web項目。本文通過ssm三大框架整合的形式講解springmvc的使用教程,最新的框架版本主流IDE,只要按照圖中步驟能夠保證每個人的框架搭建完成並成功運行。這裡使用maven來構建項目,我們需要創建一個名為ssm的maven項目,打包方式為war包。
  • 為了讓大家理解Spring Aop利器ProxyFactory,我已經拼了
    工程結構圖:概要前面兩三篇,介紹了spring aop得以實現的利器:ProxyFactory。ProxyFactory,全稱:org.springframework.aop.framework.ProxyFactory,spring帝國spring aop軍工廠boss,職責就是生產proxy,即,代理工廠。
  • SpringMVC+Mybatis 框架介紹
    一、Spring MVC框架要點1、為什麼選用SpringMVC(1)簡單易用,學習成本低,開發效率高(2)性能靈活,優於Struts(3)大眾框架,遇到問題網上有很多解決方案-- springMVC核心配置 --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet
  • Spring AOP應用場景有哪些?Aop工作原理分析
    配置ProxyFactoryBean,顯式地設置advisors, advice, target等  2.配置AutoProxyCreator,這種方式下,還是如以前一樣使用定義的bean,但是從容器中獲得的其實已經是代理對象  3.通過<aop:config>來配置  4.通過<aop: aspectj-autoproxy
  • 使用AspectJ註解技術實現AOP功能
    ● aspectj-1.8.9● aspectjweaver-1.8.9關於AOP實現原理在《詳解Spring框架的AOP機制》一文中已經詳細描述,這裡不再贅述。不過本文的AOP項目案例還是借鑑《詳解Spring框架的AOP機制》一文中的案例。因為Spring框架提供了AspectJ 註解方法和基於XML架構的方法來實現AOP,在《詳解Spring框架的AOP機制》中,重點介紹了基於XML架構的方法來實現AOP,本文將重點介紹利用AspectJ 註解方法實現AOP。
  • Java經典面試題Spring是什麼 Spring框架入門詳解
    到目前為止Sping框架就搭建完畢了。我們平時創建對象需要自己手動創建,現在對象都是通過spring容器ApplicationContext創建,這就是所謂的IOC控制反轉,如果有了解工廠設計模式的朋友會更容易理解,ApplicationContext此處就相當於一個工廠類。我之前講解MyBatis框架的SqlSession就是由SqlSesionFactory創建的。
  • Java中最強大的框架spring
    今天學習內容安排如下:對ssm框架有一個了解。IoC控制反轉的xml配置管理,這也就是spring框架的核心知識點之一。DI依賴注入的實現。前面學過的jdbc、jdbcTemplate、mybatis都是和這層是相關的,SSH框架中的hibernate,還有後續要學的SpringDateJPA都是。而我們今天要學的spring框架也就對應著業務層:無論是SSM框架還是SSH框架都有Spring,足以證明其重要性。
  • java中spring入門
    1、spring的概念apache推出的java企業框架,提供了基於ioc的對象工廠、aop面向切面編程等功能及其他增強功能。 當前版本4.xxx,支持註解的配置。 springmvc。用來描述框架的重要特徵spring針對ioc的具體實現:依賴注入(DI): Dependency Injection概念:(考點:如簡述IOC)我們需要的對象,不是由我們自己創建,而是由外部容器事先準備好,我們需要時才去拿。
  • spring面試題目!
    什麼是spring?Spring框架的設計目標,設計理念,和核心是什麼Spring的優缺點是什麼?Spring有哪些應用場景Spring由哪些模塊組成?Spring 框架中都用到了哪些設計模式?詳細講解一下核心容器(spring context應用上下文) 模塊Spring框架中有哪些不同類型的事件Spring 應用程式有哪些不同組件?使用 Spring 有哪些方式?
  • Java Web系列:Spring依賴注入基礎
    一、Spring簡介1.Spring簡化Java開發Spring Framework是一個應用框架,框架一般是半成品,我們在框架的基礎上可以不用每個項目自己實現架構、基礎設施和常用功能性組件,而是可以專注業務邏輯。因此學習Spring Framework在架構和模式方面的結構和原理,對我們在架構和模塊級別的理解幫助極大。