欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中的@Aspect注解使用詳解

 更新時間:2024年01月19日 08:33:19   作者:狂豐  
這篇文章主要介紹了Spring中的@Aspect注解使用詳解,利用AOP可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率,需要的朋友可以參考下

@Aspect注解使用

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術.AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。

在spring AOP中業(yè)務邏輯僅僅只關注業(yè)務本身,將日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等代碼從業(yè)務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業(yè)務邏輯的方法中,進而改變這些行為的時候不影響業(yè)務邏輯的代碼。

相關注解介紹:

  • @Aspect:作用是把當前類標識為一個切面供容器讀取
  • @Pointcut:Pointcut是植入Advice的觸發(fā)條件。每個Pointcut的定義包括2部分,一是表達式,二是方法簽名。方法簽名必須是 public及void型。可以將Pointcut中的方法看作是一個被Advice引用的助記符,因為表達式不直觀,因此我們可以通過方法簽名的方式為 此表達式命名。因此Pointcut中的方法只需要方法簽名,而不需要在方法體內(nèi)編寫實際代碼。
  • @Around:環(huán)繞增強,相當于MethodInterceptor
  • @AfterReturning:后置增強,相當于AfterReturningAdvice,方法正常退出時執(zhí)行
  • @Before:標識一個前置增強方法,相當于BeforeAdvice的功能,相似功能的還有
  • @AfterThrowing:異常拋出增強,相當于ThrowsAdvice
  • @After: final增強,不管是拋出異?;蛘哒M顺龆紩?zhí)行

使用pointcut代碼:

package com.aspectj.test.advice;
 
import java.util.Arrays;
 
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
 
@Aspect
public class AdviceTest {
    @Around("execution(* com.abc.service.*.many*(..))")
    public Object process(ProceedingJoinPoint point) throws Throwable {
        System.out.println("@Around:執(zhí)行目標方法之前...");
        //訪問目標方法的參數(shù):
        Object[] args = point.getArgs();
        if (args != null && args.length > 0 && args[0].getClass() == String.class) {
            args[0] = "改變后的參數(shù)1";
        }
        //用改變后的參數(shù)執(zhí)行目標方法
        Object returnValue = point.proceed(args);
        System.out.println("@Around:執(zhí)行目標方法之后...");
        System.out.println("@Around:被織入的目標對象為:" + point.getTarget());
        return "原返回值:" + returnValue + ",這是返回結(jié)果的后綴";
    }
    
    @Before("execution(* com.abc.service.*.many*(..))")
    public void permissionCheck(JoinPoint point) {
        System.out.println("@Before:模擬權限檢查...");
        System.out.println("@Before:目標方法為:" + 
                point.getSignature().getDeclaringTypeName() + 
                "." + point.getSignature().getName());
        System.out.println("@Before:參數(shù)為:" + Arrays.toString(point.getArgs()));
        System.out.println("@Before:被織入的目標對象為:" + point.getTarget());
    }
    
    @AfterReturning(pointcut="execution(* com.abc.service.*.many*(..))", 
        returning="returnValue")
    public void log(JoinPoint point, Object returnValue) {
        System.out.println("@AfterReturning:模擬日志記錄功能...");
        System.out.println("@AfterReturning:目標方法為:" + 
                point.getSignature().getDeclaringTypeName() + 
                "." + point.getSignature().getName());
        System.out.println("@AfterReturning:參數(shù)為:" + 
                Arrays.toString(point.getArgs()));
        System.out.println("@AfterReturning:返回值為:" + returnValue);
        System.out.println("@AfterReturning:被織入的目標對象為:" + point.getTarget());
        
    }
    
    @After("execution(* com.abc.service.*.many*(..))")
    public void releaseResource(JoinPoint point) {
        System.out.println("@After:模擬釋放資源...");
        System.out.println("@After:目標方法為:" + 
                point.getSignature().getDeclaringTypeName() + 
                "." + point.getSignature().getName());
        System.out.println("@After:參數(shù)為:" + Arrays.toString(point.getArgs()));
        System.out.println("@After:被織入的目標對象為:" + point.getTarget());
    }
}

使用annotation代碼:

//注解實體類
package com.trip.demo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface SMSAndMailSender {
    /*短信模板String格式化串*/
    String value() default "";
    String smsContent() default "";
    String mailContent() default "";
    /*是否激活發(fā)送功能*/
    boolean isActive() default true;
    /*主題*/
    String subject() default "";
}
//切面類
@Aspect
@Component("smsAndMailSenderMonitor")
public class SMSAndMailSenderMonitor {
    private Logger logger = LoggerFactory.getLogger(SMSAndMailSenderMonitor.class);
    /**
     * 在所有標記了@SMSAndMailSender的方法中切入
     * @param joinPoint
     * @param result
     */
    @AfterReturning(value="@annotation(com.trip.demo.SMSAndMailSender)", returning="result")//有注解標記的方法,執(zhí)行該后置返回
    public void afterReturning(JoinPoint joinPoint , Object result//注解標注的方法返回值) {
        MethodSignature ms = (MethodSignature) joinPoint.getSignature();
        Method method = ms.getMethod();
        boolean active = method.getAnnotation(SMSAndMailSender.class).isActive();
        if (!active) {
            return;
        }
        String smsContent = method.getAnnotation(SMSAndMailSender.class).smsContent();
        String mailContent = method.getAnnotation(SMSAndMailSender.class).mailContent();
        String subject = method.getAnnotation(SMSAndMailSender.class).subject();
    }
    /**
     * 在拋出異常時使用
     * @param joinPoint
     * @param ex
     */
    @AfterThrowing(value="@annotation(com.trip.order.monitor.SMSAndMailSender)",throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Throwable ex//注解標注的方法拋出的異常) {
        MethodSignature ms = (MethodSignature) joinPoint.getSignature();
        Method method = ms.getMethod();
        String subject = method.getAnnotation(SMSAndMailSender.class).subject();
    }
}
//實體類中使用該注解標注方法
@Service("testService ")
public class TestService {
    @Override
    @SMSAndMailSender(smsContent = "MODEL_SUBMIT_SMS", mailContent =     
    "MODEL_SUPPLIER_EMAIL", subject = "MODEL_SUBJECT_EMAIL")
    public String test(String param) {
        return "success";
    }
}
 

注意,記得在配置文件中加上:

<aop:aspectj-autoproxy proxy-target-class="true"/>

到此這篇關于Spring中的@Aspect注解使用詳解的文章就介紹到這了,更多相關@Aspect注解使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談單例模式和線程安全問題

    淺談單例模式和線程安全問題

    這篇文章主要介紹了淺談單例模式和線程安全問題,再某些特殊的情況下,存在一個類僅能用來產(chǎn)生一個唯一對象的必要性,因此需要單例模式,需要的朋友可以參考下
    2023-04-04
  • MyBatis實現(xiàn)數(shù)據(jù)庫類型和Java類型的轉(zhuǎn)換

    MyBatis實現(xiàn)數(shù)據(jù)庫類型和Java類型的轉(zhuǎn)換

    MyBatis 在處理數(shù)據(jù)庫查詢結(jié)果或傳遞參數(shù)時,需要將數(shù)據(jù)庫類型與 Java 類型之間進行轉(zhuǎn)換,本文就給大家介紹MyBatis如何實現(xiàn)數(shù)據(jù)庫類型和 Java 類型的轉(zhuǎn)換的,需要的朋友可以參考下
    2024-09-09
  • 詳解Spring mvc DispatchServlet 實現(xiàn)機制

    詳解Spring mvc DispatchServlet 實現(xiàn)機制

    本篇文章主要介紹了詳解Spring mvc DispatchServlet 實現(xiàn)機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 基于spring boot 命令行啟動的一些坑

    基于spring boot 命令行啟動的一些坑

    這篇文章主要介紹了spring boot 命令行啟動的一些坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Eclipse內(nèi)置瀏覽器打開方法

    Eclipse內(nèi)置瀏覽器打開方法

    這篇文章主要介紹了Eclipse內(nèi)置瀏覽器打開方法,需要的朋友可以了解下。
    2017-09-09
  • 在Java中如何比較兩個對象淺析

    在Java中如何比較兩個對象淺析

    在工作中我們經(jīng)常會遇到這樣的需求——比較兩個對象是否相等,如果不相等的話,取出不相等的字段,這篇文章主要給大家介紹了關于在Java中如何比較兩個對象的相關資料,需要的朋友可以參考下
    2021-11-11
  • Spring Boot簡介與快速搭建詳細步驟

    Spring Boot簡介與快速搭建詳細步驟

    SpringBoot其本身沒有添加什么新的技術,就是整合了一些現(xiàn)有的框架,并提供了一些默認的配置,就是這些默認的配置,極大的提高了我們的開發(fā)效率。這篇文章主要介紹了Spring Boot簡介與快速搭建,需要的朋友可以參考下
    2021-05-05
  • Java AbstractMethodError原因案例詳解

    Java AbstractMethodError原因案例詳解

    這篇文章主要介紹了Java AbstractMethodError原因案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot @NotBlank錯誤的解決方案

    SpringBoot @NotBlank錯誤的解決方案

    這篇文章主要介紹了SpringBoot @NotBlank錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring Boot Actuator入門指南

    Spring Boot Actuator入門指南

    SpringBootActuator是SpringBoot提供的一系列產(chǎn)品級特性,用于監(jiān)控應用程序、收集元數(shù)據(jù)和運行情況,通過添加依賴,可以通過HTTP或JMX與外界交互,本文介紹Spring Boot Actuator的相關知識,感興趣的朋友一起看看吧
    2025-02-02

最新評論