Spring AOP學習(二) -- Spring AOP的簡單使用

今天對 Spring AOP的使用作個簡單說明。spring

一、AOP的實現方式: 1)XML 2)註解maven

二、在上面兩種實現方式中,如今註解使用的愈來愈普遍;它的主要好處是寫起來比xml要方便的多,但也有解分散到不少類中,很差管理和維護的缺點,今天主要分享經過註解的實現方式。 主要註解有: @Aspect、@Pointcut 和通知,見下圖:spring-boot

![![Spring AOP主要註解]單元測試

三、註解說明: 1)@Aspect:類級別註解,用來標誌類爲切面類。測試

1)Pointcut表達式: (1)designators (指示器):經過哪些方法和方式,去匹配類和方法;如executionthis

  • 匹配方法:execution() exeution 表達式:execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數模式>)<異常模式>?) 除了返回類型模式、方法名模式和參數模式外,其它項都是可選的(表達式的問號表示能夠省略)。 eg:(* com.evan.crm.service..(..))中幾個通配符的含義: 第一個 * —— 通配 隨便率性返回值類型 第二個 * —— 通配包com.evan.crm.service下的任意class 第三個 * —— 通配包com.evan.crm.service下的任意class的任意方法 第四個 .. —— 通配 辦法能夠有0個或多個參數
  • 匹配註解:@target()、@args()、@within()、@annotation()
  • 匹配包、類型:within()
  • Within 舉例 // 匹配TestService裏面的全部方法 @Pointcut(「within(com.test.service.TestService)」) public void xxx(){}
  • 匹配對象:this()、bean()、target() this 匹配代理後; target 匹配代理前的; bean匹配全部符合規則的bean裏頭的方法。
  • 匹配參數:args()、execution()方法
  • 匹配註解:其中@annotation是方法級別的, @within和@target是類級別的,@args是參數級別的。

(2)Wildcards:經過通配符描述方法,如「* .. +」等代理

  • * : 匹配任意數量的字符
  • + : 匹配指定類及其子類
  • .. : 通常用於匹配人任意數的子包或參數

(3)operators:如||、&&、!code

  • && : 與操做符,表示同時知足
  • || : 或操做符
  • ! : 非操做符

2)Adivice註解(5種)xml

  • @Before:方法前執行
  • @AfterReturning:運行方法後執行
  • @AfterThrowing:Throw後執行
  • @After:不管方法以何種方式結束,都會執行(相似於finally)
  • @Around:環繞執行

四、使用的簡單例子:對象

1)新建springboo引入Spring AOP maven依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>

2)一個產品Service類,代碼:

import org.springframework.stereotype.Service;

@Service
public class ProductService{

	public void saveProduct() {
		System.out.println("save product now ……");
	}

	public void deleteProduct() {
		System.out.println("delete product now ……");
	}
}

3)編寫切面類:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AspectTest {

	@Pointcut("within(cn.exercise.service.impl.ProductService)")
	public void adminOnly() {
	}

	@Before("adminOnly()")
	public void before() {
		System.out.println("------------ @Aspect ###before");
	}
}

4)編寫單元測試:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import cn.exercise.service.impl.ProductService;

@RunWith(SpringRunner.class)
@SpringBootTest
public class AopLeaningdemoApplicationTests {

	@Autowired
	private ProductService productService;
	
	@Test
	public void testAOP() {
		productService.saveProduct();
		productService.deleteProduct();
	}

}

5)運行結果:

運行結果圖

相關文章
相關標籤/搜索