1、下面介紹與Spring AOP相關的一些概念。java
1. 橫切關注點spring
一些具備橫切多個不一樣軟件模塊的行爲,經過傳統的軟件開發方法不可以有效地實現模塊化的一類特殊關注點。橫切關注點能夠對某些方法進行攔截,攔截後對原方法進行加強處理。模塊化
2. 切面(Aspect)測試
切面就是對橫切關注點的抽象,這個關注點可能會橫切多個對象。spa
3. 鏈接點(JoinPoint)代理
鏈接點是在程序執行過程當中某個特定的點,好比某方法調用的時候或者處理異常的時候。因爲Spring只支持方法類型的鏈接點,因此在Spring AOP中一個鏈接點老是表示一個方法的執行。code
4. 切入點(Pointcut)component
切入點是匹配鏈接點的攔截規則,在知足這個切入點的鏈接點上運行通知。切入點表達式如何和鏈接點匹配是AOP的核心,Spring默認使用AspectJ切入點語法。xml
5. 通知(Advice)對象
在切面上攔截到某個特定的鏈接點以後執行的動做。
6. 目標對象(Target Object)
目標對象,被一個或者多個切面所通知的對象,即業務中須要進行加強的業務對象。
7. 織入(Weaving)
織入是把切面做用到目標對象,而後產生一個代理對象的過程。
8. 引入(Introduction)
引入是用來在運行時給一個類聲明額外的方法或屬性,即不需爲類實現一個接口,就能使用接口中的方法。
2、下面介紹加強的類型
AOP聯盟爲加強定義了org.aopalliance.aop.Advice接口,Spring支持5種類型的加強。如下顯示用到的@Before、@After等註解是基於AspectJ實現的加強類型。其實Spring也支持不少加強類型,Spring AOP按照加強在目標類方法中的鏈接點位置能夠分爲5種。
• 前置加強(MethodBeforeAdvice):表示在目標方法執行前實施加強。
• 後置加強(AfterReturningAdvice):表示在目標方法執行後實施加強。
• 環繞加強(MethodInterceptor):表示在目標方法執行先後實施加強。
• 異常拋出加強(ThrowsAdvice):表示在目標方法拋出異常後實施加強。
• 引介加強(IntroductionInterceptor):表示在目標類中添加一些新的方法和屬性。
AOP聯盟的頂級接口是Advice,其類圖以下:
3、用文字介紹概念太抽象了,如下用代碼來表示各個概念
一、要加強的類
package com.test.aspectj.advicetype; import org.springframework.stereotype.Component; /** * 一個Spring Bean */ @Component public class Person { /** * 說話的方法 */ public void say() { System.out.println("Hello spring5"); } }
二、切面類
package com.test.aspectj.advicetype; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; /** * 包含各類加強類型的切面 */ @Component @Aspect public class AllAspect { /** * 切入點 */ @Pointcut("execution(* com.test.aspectj.advicetype.*.*(..))") public void allAointCut() { } /** * 前置加強 */ @Before("allAointCut()") public void before() { System.out.println("before advice"); } /** * 環繞加強 * @param proceedingJoinPoint */ @Around("allAointCut()") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("around advice 1"); proceedingJoinPoint.proceed(); System.out.println("around advice 2"); } /** * 後置加強 */ @AfterReturning("allAointCut()") public void afterReturning() { System.out.println("afterReturning advise"); } /** * 異常拋出加強 */ @AfterThrowing("allAointCut()") public void afterThrowing() { System.out.println("afterThrowing advice"); } /** * 後置加強 */ @After("allAointCut()") public void after() { System.out.println("after advise"); } }
三、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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 開啓註解掃描 --> <context:component-scan base-package="com.test.aspectj.advicetype"/> <!-- 開啓aop註解方式,此步驟不能少 --> <aop:aspectj-autoproxy/> </beans>
四、測試代碼
package com.test.aspectj.advicetype; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 測試各類類型的加強 */ public class AllAspectDemo { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-chapter3-aoptype.xml"); Person person = (Person) context.getBean("person"); person.say(); } }
五、運行結果
around advice 1 before advice Hello spring5 around advice 2 after advise afterReturning advise