最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的@Aspect注解使用詳解

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

@Aspect注解使用

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

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

相關(guān)注解介紹:

  • @Aspect:作用是把當(dāng)前類標(biāo)識(shí)為一個(gè)切面供容器讀取
  • @Pointcut:Pointcut是植入Advice的觸發(fā)條件。每個(gè)Pointcut的定義包括2部分,一是表達(dá)式,二是方法簽名。方法簽名必須是 public及void型。可以將Pointcut中的方法看作是一個(gè)被Advice引用的助記符,因?yàn)楸磉_(dá)式不直觀,因此我們可以通過(guò)方法簽名的方式為 此表達(dá)式命名。因此Pointcut中的方法只需要方法簽名,而不需要在方法體內(nèi)編寫實(shí)際代碼。
  • @Around:環(huán)繞增強(qiáng),相當(dāng)于MethodInterceptor
  • @AfterReturning:后置增強(qiáng),相當(dāng)于AfterReturningAdvice,方法正常退出時(shí)執(zhí)行
  • @Before:標(biāo)識(shí)一個(gè)前置增強(qiáng)方法,相當(dāng)于BeforeAdvice的功能,相似功能的還有
  • @AfterThrowing:異常拋出增強(qiáng),相當(dāng)于ThrowsAdvice
  • @After: final增強(qiáng),不管是拋出異?;蛘哒M顺龆紩?huì)執(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í)行目標(biāo)方法之前...");
        //訪問(wèn)目標(biāo)方法的參數(shù):
        Object[] args = point.getArgs();
        if (args != null && args.length > 0 && args[0].getClass() == String.class) {
            args[0] = "改變后的參數(shù)1";
        }
        //用改變后的參數(shù)執(zhí)行目標(biāo)方法
        Object returnValue = point.proceed(args);
        System.out.println("@Around:執(zhí)行目標(biāo)方法之后...");
        System.out.println("@Around:被織入的目標(biāo)對(duì)象為:" + point.getTarget());
        return "原返回值:" + returnValue + ",這是返回結(jié)果的后綴";
    }
    
    @Before("execution(* com.abc.service.*.many*(..))")
    public void permissionCheck(JoinPoint point) {
        System.out.println("@Before:模擬權(quán)限檢查...");
        System.out.println("@Before:目標(biāo)方法為:" + 
                point.getSignature().getDeclaringTypeName() + 
                "." + point.getSignature().getName());
        System.out.println("@Before:參數(shù)為:" + Arrays.toString(point.getArgs()));
        System.out.println("@Before:被織入的目標(biāo)對(duì)象為:" + 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:目標(biāo)方法為:" + 
                point.getSignature().getDeclaringTypeName() + 
                "." + point.getSignature().getName());
        System.out.println("@AfterReturning:參數(shù)為:" + 
                Arrays.toString(point.getArgs()));
        System.out.println("@AfterReturning:返回值為:" + returnValue);
        System.out.println("@AfterReturning:被織入的目標(biāo)對(duì)象為:" + point.getTarget());
        
    }
    
    @After("execution(* com.abc.service.*.many*(..))")
    public void releaseResource(JoinPoint point) {
        System.out.println("@After:模擬釋放資源...");
        System.out.println("@After:目標(biāo)方法為:" + 
                point.getSignature().getDeclaringTypeName() + 
                "." + point.getSignature().getName());
        System.out.println("@After:參數(shù)為:" + Arrays.toString(point.getArgs()));
        System.out.println("@After:被織入的目標(biāo)對(duì)象為:" + point.getTarget());
    }
}

使用annotation代碼:

//注解實(shí)體類
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);
    /**
     * 在所有標(biāo)記了@SMSAndMailSender的方法中切入
     * @param joinPoint
     * @param result
     */
    @AfterReturning(value="@annotation(com.trip.demo.SMSAndMailSender)", returning="result")//有注解標(biāo)記的方法,執(zhí)行該后置返回
    public void afterReturning(JoinPoint joinPoint , Object result//注解標(biāo)注的方法返回值) {
        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();
    }
    /**
     * 在拋出異常時(shí)使用
     * @param joinPoint
     * @param ex
     */
    @AfterThrowing(value="@annotation(com.trip.order.monitor.SMSAndMailSender)",throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Throwable ex//注解標(biāo)注的方法拋出的異常) {
        MethodSignature ms = (MethodSignature) joinPoint.getSignature();
        Method method = ms.getMethod();
        String subject = method.getAnnotation(SMSAndMailSender.class).subject();
    }
}
//實(shí)體類中使用該注解標(biāo)注方法
@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"/>

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

相關(guān)文章

  • 詳解java中if語(yǔ)句和switch的使用

    詳解java中if語(yǔ)句和switch的使用

    這篇文章主要介紹了java中if語(yǔ)句和switch的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java快速排序的實(shí)現(xiàn)詳細(xì)代碼及通俗解釋

    Java快速排序的實(shí)現(xiàn)詳細(xì)代碼及通俗解釋

    這篇文章主要介紹了Java快速排序?qū)崿F(xiàn)的相關(guān)資料,快速排序是一種高效的排序算法,通過(guò)選擇一個(gè)基準(zhǔn)值將數(shù)組分成兩部分,左邊的元素比基準(zhǔn)值小,右邊的元素比基準(zhǔn)值大,然后遞歸地對(duì)這兩部分進(jìn)行排序,需要的朋友可以參考下
    2025-02-02
  • 小白必看toString(),String.valueOf,(String)強(qiáng)轉(zhuǎn)

    小白必看toString(),String.valueOf,(String)強(qiáng)轉(zhuǎn)

    在Java中,往往需要把一個(gè)類型的變量轉(zhuǎn)換成String 類型,本文主要介紹了toString(),String.valueOf,(String)強(qiáng)轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • SpringBoot3和4的版本新特性及升級(jí)要點(diǎn)詳解

    SpringBoot3和4的版本新特性及升級(jí)要點(diǎn)詳解

    Spring Boot 4.0作為生態(tài)內(nèi)的重大更新,基于Spring Framework 6.1+ 構(gòu)建,帶來(lái)了一系列顛覆性優(yōu)化,這篇文章主要介紹了SpringBoot3和4的版本新特性及升級(jí)要點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn)

    IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn)

    本文主要介紹了IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java中局部變量和成員變量的區(qū)別詳解

    Java中局部變量和成員變量的區(qū)別詳解

    這篇文章主要介紹了Java中局部變量和成員變量的區(qū)別,本文將通過(guò)示例為大家詳細(xì)講講Java中成員變量與局部變量之間的區(qū)別,感興趣的同學(xué)可以了解一下
    2023-05-05
  • Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

    Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

    這篇文章主要介紹了Mybatis_plus基礎(chǔ)教程(總結(jié)篇),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • springboot啟動(dòng)流程過(guò)程

    springboot啟動(dòng)流程過(guò)程

    Spring Boot 簡(jiǎn)化了 Spring 框架的使用,通過(guò)創(chuàng)建 `SpringApplication` 對(duì)象,判斷應(yīng)用類型并設(shè)置初始化器和監(jiān)聽器,在 `run` 方法中,讀取配置并加載到 `Environment` 中,通過(guò) Spring 事件機(jī)制和 `EnvironmentPostProcessor` 處理配置
    2025-02-02
  • 詳解Spring中BeanUtils工具類的使用

    詳解Spring中BeanUtils工具類的使用

    這篇文章主要通過(guò)一些示例為大家詳細(xì)介紹了Spring中BeanUtils工具類的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • 使用easy connect之后,maven無(wú)法使用,原來(lái)需要配置-Djava.net.preferIPv4Stack=true問(wèn)題

    使用easy connect之后,maven無(wú)法使用,原來(lái)需要配置-Djava.net.preferIPv4S

    這篇文章主要介紹了使用easy connect之后,maven無(wú)法使用,原來(lái)需要配置-Djava.net.preferIPv4Stack=true問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05

最新評(píng)論

师宗县| 秦安县| 车险| 铜梁县| 开原市| 隆昌县| 彰化市| 湖口县| 沅陵县| 稻城县| 招远市| 涟源市| 鄱阳县| 松原市| 襄汾县| 历史| 大安市| 西贡区| 雅江县| 吴江市| 革吉县| 西华县| 静安区| 额尔古纳市| 镇远县| 开封市| 汪清县| 桐柏县| 静乐县| 荔浦县| 谢通门县| 怀柔区| 成武县| 德惠市| 凤山县| 昂仁县| 伊金霍洛旗| 霸州市| 江山市| 襄城县| 建水县|