1. 程式人生 > >Spring AOP 註解式和方法規則攔截

Spring AOP 註解式和方法規則攔截

AOP

面向切面程式設計,Spring AOP  的存在是為了解耦, AOP 可以讓一組類共享相同的行為.在 OOP 只能通過繼承類和實現介面,來使程式碼的耦合度增加,且類整合只能為單繼承,阻礙更多行為新增到同一類上, AOP 彌補了 OOP 的不足.

Spring 支援 AspectJ  的註解式切面程式設計.

  1. 使用 @AspectJ 宣告一個切面
  2. 使用 @After @Before@Around 定義建言(advice), 可直接將攔截規則(切點)作為引數.
  3. 其中 @After @Before@Around引數的攔截規則為切點(PointCut), 為了使切點複用,可使用
    @PointCut 專門定義攔截規則,然後 @After @Before@Around 的引數中呼叫.
  4. 其中符合條件的每一個被攔截處為連線點( JoinPoint)

註解:

package com.pangu.aop;

import org.springframework.stereotype.Service;

/**
 * @ClassName: DemoAnnotationService
 * @Description: TODO 編寫使用註解被攔截類
 * @author etfox
 * @date 2018年8月19日 下午8:22:59
 *
 * @Copyright: 2018 www.etfox.com Inc. All rights reserved.
 */
@Service
public class DemoAnnotationService {
    
    @Action(name="註解式攔截的 add 操作.")
    public void add(){}
    
}

方法 

package com.pangu.aop;

import org.springframework.stereotype.Service;

/**
 * @ClassName: DemoMethodService
 * @Description: TODO 編寫使用方法規則被攔截類
 * @author etfox
 * @date 2018年8月19日 下午8:24:12
 *
 * @Copyright: 2018 www.etfox.com Inc. All rights reserved.
 */
@Service
public class DemoMethodService {
    public void add(){}
}

 需要被攔截的自定義註解:

package com.pangu.aop;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @ClassName: Action
 * @Description: TODO 編寫攔截規則的註解
 * @author etfox
 * @date 2018年8月19日 下午8:22:03
 *
 * @Copyright: 2018 www.etfox.com Inc. All rights reserved.
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
    String name();
}

 日誌切面:

package com.pangu.aop;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Aspect //宣告一個切面
@Component //讓這個切面成為 spring 管理的 Bean
public class LogAspect {
    //宣告切點
    @Pointcut("@annotation(com.pangu.aop.Action)")
    public void annotationPointCut(){}
    //通過@After註解宣告一個建言,並使用@PointCut 定義的切點
    @After("annotationPointCut()")
    public void after(JoinPoint joinPoint){
        MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        Action annotation = method.getAnnotation(Action.class);
        System.out.println("註解式攔截:"+ annotation.name());
    }
    //通過@Before註解宣告一個建言,此建言直接使用攔截規則作為引數
    @Before("execution(* com.pangu.aop.DemoMethodService.*(..))")
    public void before(JoinPoint joinPoint){
        MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        System.out.println("方法規則攔截"+ method.getName());
    }
}

 配置:

package com.pangu.aop;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration //配置
@ComponentScan("com.pangu.aop") //掃描
@EnableAspectJAutoProxy //開啟 Spring 對 AspectJ 的支援
public class AopConfig {

}

 測試:

package com.pangu.aop;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestMain {
    
    @Test
    public void test(){
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(AopConfig.class);
        DemoAnnotationService annotationService = context.getBean(DemoAnnotationService.class);
        DemoMethodService demoMethodService = context.getBean(DemoMethodService.class);
        annotationService.add();
        demoMethodService.add();
        context.close();
    }
    
}

結果:

八月 19, 2018 9:58:46 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
資訊: Refreshing org.spring[email protected]53bd815b: startup date [Sun Aug 19 21:58:46 CST 2018]; root of context hierarchy
註解式攔截註解式攔截的 add 操作.
註解式攔截add
八月 19, 2018 9:58:47 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
資訊: Closing org.spring[email protected]53bd815b: startup date [Sun Aug 19 21:58:46 CST 2018]; root of context hierarchy

end.

相關推薦

Spring AOP 註解方法規則攔截

AOP 面向切面程式設計,Spring AOP  的存在是為了解耦, AOP 可以讓一組類共享相同的行為.在 OOP 只能通過繼承類和實現介面,來使程式碼的耦合度增加,且類整合只能為單繼承,阻礙更多行為新增到同一類上, AOP 彌補了 OOP 的不足. Spring 支援

SpringBoot —— AOP註解攔截方法規則攔截

運行 處理程序 return 編譯 clear 字節碼 動態獲取 nconf {}   AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法,所以它有一個專門的編譯器用來生成遵守Java字節編碼規範的Class文件。   SpringBo

net core天馬行空系列:原生DI+AOP實現spring boot註解程式設計

       寫過spring boot之後,那種無處不在的註解讓我非常喜歡,比如屬性注入@autowire,配置值注入@value,宣告式事物@Transactional等,都非常簡潔優雅,那麼我就在想,這些在net core裡能實現麼?經過一番摸索,終於實現並整理成

spring-AOP之通知顧問

多個 targe ges 配置 context color ive 後置 功能 通知和顧問都是切面的實現形式,其中通知可以完成對目標對象方法簡單的織入功能。 而顧問包裝了通知,可以讓我們對通知實現更加精細化的管理,讓我們可以指定具體的切入點。 通知分為前置通知,環繞通知及後

日誌異常處理-spring aop註解

get target public ring -s row imp for method spring aop 可以在不破壞我們程序代碼的前提下很好的對程序異常進行打印,網上也有很多這樣的例子,我這裏寫的比較簡單,只是針對程序出異常時進行見到的日誌打印,代碼比較簡單。

Spring aop 註解參數說明

spring 連接 href 僅支持 blank code exec data aspectj 在spring AOP中,需要使用AspectJ的切點表達式語言來定義切點。 關於Spring AOP的AspectJ切點,最重要的一點是Spring僅支持AspectJ切點指示

Spring AOP 註解形式

github 日誌記錄 throw 異常 動態字節碼 span pack 規則 tor AspectOriented Programing,面向切面編程。   AOP主要用於日誌記錄,性能統計,安全控制(權限控制),事務處理,異常處理等。將日誌記錄,性

Spring AOP introduction 類級別方法織入增強

shadow intercept cda 擴展 sha oss text 都是 tor 前面描述的幾種增強(Advice)都是在目標方法範圍內織入,而引介(Introduction)不同,直接在類級別上添加目標未實現的接口方法。在Spring中可以通過擴展Delegatin

Spring---AOP註解開發&jdbc模板&Spring事務管理

use oca update -m spl pub tex com att 一、AOP註解開發   此處需要回憶一遍AOP的概念。簡單的來說,AOP就是利用動態代理技術,做到不觸動源代碼但卻擴展了功能。那麽就需要一個被擴展的對象和一個“新的功能”,例如說給某類的saveUs

Spring aop註解失效

led end int pos 調用 cnblogs 問題 lock 查看 問題 在spring 中使用 @Transactional 、 @Cacheable 或 自定義 AOP 註解時,對象內部方法中調用該對象的其他使用aop機制的方法會失效。 @Transa

Spring AOP註解形式簡單實現

之前 [] 依賴註入 .com proxy sta 對象 instance author 實現步驟:   1:導入類掃描的註解解析器    命名空間:xmlns:context="http://www.springframework.org/schema/context" 

【學習筆記】Spring AOP註解使用總結

trace -a tid nat 修改 with this throwable pid Spring AOP基本概念 是一種動態編譯期增強性AOP的實現 與IOC進行整合,不是全面的切面框架 與動態代理相輔相成 有兩種實現:基於jdk動態代理、cglib Spring

spring aop註解失效之謎

問題: 在spring 中使用 @Transactional 、 @Cacheable 或 自定義 AOP 註解時,會發現個問題: 在物件內部的方法中呼叫該物件的其他使用aop機制的方法,被呼叫方法的aop註解失效。 這句話可能說的有點拗口,那麼我們來看幾個 aop 失效的例子吧

spring-aop註解程式設計

  今天價紹的是AspectJ的註解開發: 一  AOP術語 要想面向切面程式設計,我們首先得了解一些基本的術語以及幾種不同的通知: 1.target目標類:需要被代理的類,我們可以簡單的理解為需要服務層中需要公共模組能力的類; 2.JoinPoint連線

Spring AOP註解配置demo

https://blog.csdn.net/yhl_jxy/article/details/78815636#commentBox   一 AOP的概念    AOP(Aspect Oriented Programming),即為面向切面程式設計。在軟體開發中,散佈於應用中多

Spring AOP註解方式實現

簡介 上文已經提到了Spring AOP的概念以及簡單的靜態代理、動態代理簡單示例,連結地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文將介紹Spring AOP的常用註解以及註解形式實現動態代理的簡單示例。 常用註解 @aspect:定

Spring AOP表達報錯:Pointcut is not well-formed: expecting 'name pattern' at character position

ret reg tin lips aspect lock alua depend internal   問題現象: java.lang.IllegalStateException: Failed to load ApplicationContext at org.

6.spring:AOP(註解

 spring Aop  AOP面向切面程式設計,與OOP面向物件程式設計相輔相成 AOP中最基本的單元是切面   問題: 程式碼混亂:越來越多的業務需求(日誌&驗證)加入後,原有的業務方法急劇膨脹,每個方法在處理核心程式碼的同時還必須兼顧其他的多個關注點 程式

Spring AOP註解通過@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入屬性的

本文介紹了使用spring註解注入屬性的方法。 使用註解以前,注入屬性通過類以及配置檔案來實現。現在,注入屬性可以通過引入@Autowired註解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等註解來實現。 使用註解以前我們是怎樣注入屬性的 類的實現

Spring AOP註解的學習與實踐

AOP AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不