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

Spring AOP與AspectJ的對比及應用詳解

 更新時間:2023年02月08日 17:20:53   作者:南瓜慢說  
這篇文章主要為大家介紹了Spring AOP與AspectJ的對比及應用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1 簡介

AOP,即面向切面編程是很常用的技術(shù),特別是在Java Web開發(fā)中。而最流行的AOP框架分別是Spring AOP和AspectJ。

2 Spring AOP vs AspectJ

Spring AOP是基于Spring IoC實現(xiàn)的,它解決大部分常見的需求,但它并不是一個完整的AOP解決方案。對于非Spring容器管理的對象,它更沒有辦法了。而AspectJ旨在提供完整的AOP方案,因此也會更復雜。

2.1 織入方式

兩者織入方式有極大的不同,這也是它們的本質(zhì)區(qū)別,它們實現(xiàn)代理的方式不同。

AspectJ是在運行前織入的,分為三類:

  • 編譯時織入
  • 編譯后織入
  • 加載時織入

因此需要AspectJ編譯器(ajc)的支持。

而Spring AOP是運行時織入的,主要使用了兩種技術(shù):JDK動態(tài)代理和CGLIB代理。對于接口使用JDK Proxy,而繼承的使用CGLIB。

2.2 Joinpoints

因為織入方式的區(qū)別,兩者所支持的Joinpoint也是不同的。像final的方法和靜態(tài)方法,無法通過動態(tài)代理來改變,所以Spring AOP無法支持。但AspectJ是直接在運行前織入實際的代碼,所以功能會強大很多。

JoinpointSpring AOP SupportedAspectJ Supported
Method CallNoYes
Method ExecutionYesYes
Constructor CallNoYes
Constructor ExecutionNoYes
Static initializer executionNoYes
Object initializationNoYes
Field referenceNoYes
Field assignmentNoYes
Handler executionNoYes
Advice executionNoYes

2.3 性能

編譯織入會比較運行時織入快很多,Spring AOP是使用代理模式在運行時才創(chuàng)建對應的代理類,效率沒有AspectJ高。

3 Spring Boot使用AspectJ

因為AspectJ比較強大,在項目中應用會更多,所以這里只介紹它與Spring Boot的集成。

3.1 引入依賴

引入以下依賴,在Spring Boot基礎(chǔ)上加了Lombok和aspectj:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectj.version}</version>
  </dependency>
  <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${aspectj.version}</version>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

3.2 被AOP的對象

為了驗證AOP的功能,我們添加一個TestController,它有一個處理Get請求的方法,同時會調(diào)用private的成員方法和靜態(tài)方法:

@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
    @GetMapping("/hello")
    public String hello() {
        log.info("------hello() start---");
        test();
        staticTest();
        log.info("------hello() end---");
        return "Hello, pkslow.";
    }
    private void test() {
        log.info("------test() start---");
        log.info("test");
        log.info("------test() end---");
    }
    private static void staticTest() {
        log.info("------staticTest() start---");
        log.info("staticTest");
        log.info("------staticTest() end---");
    }
}

3.3 配置Aspect

配置切面如下:

@Aspect
@Component
@Slf4j
//@EnableAspectJAutoProxy
public class ControllerAspect {
    @Pointcut("execution(* com.pkslow.springboot.controller..*.*(..))")
    private void testControllerPointcut() {
    }
    @Before("testControllerPointcut()")
    public void doBefore(JoinPoint joinPoint){
        log.info("------pkslow aop doBefore start------");
        String method = joinPoint.getSignature().getName();
        String declaringTypeName = joinPoint.getSignature().getDeclaringTypeName();
        log.info("Method: {}.{}" ,declaringTypeName, method);
        log.info("------pkslow aop doBefore end------");
    }
    @Around("testControllerPointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("------pkslow aop doAround start------");
        long start = System.nanoTime();
        Object obj = joinPoint.proceed();
        long end = System.nanoTime();
        log.info("Execution Time: " + (end - start) + " ns");
        log.info("------pkslow aop doAround end------");
        return obj;
    }
}

@Pointcut定義哪些類和方法會被捕抓來代理,這里配置的是controller下的所有方法。

@Before@Around則定義了一些處理邏輯。@Before是打印了方法名,而@Around是做了一個計時。

注意:是不需要配置@EnableAspectJAutoProxy的。

3.4 maven插件

因為是需要編譯時織入代碼,所以需要maven插件的支持:github.com/mojohaus/as…

配置好pom.xml文件即可。

然后執(zhí)行命令打包:

mvn clean package

這時會顯示一些織入信息,大致如下:

[INFO] Join point 'method-execution(java.lang.String com.pkslow.springboot.controller.TestController.hello())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:14) advised by around advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(java.lang.String com.pkslow.springboot.controller.TestController.hello())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:14) advised by before advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.test())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:22) advised by around advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.test())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:22) advised by before advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.staticTest())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:28) advised by around advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.staticTest())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:28) advised by before advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))

看到以上信息,說明成功織入了代碼,具體可以查看生成的class文件。

可以看到有許多代碼都不是我們寫的,而是織入生成。

3.5 執(zhí)行及測試

編譯成功后,我們就執(zhí)行代碼。如果是通過IDEA來執(zhí)行,則在運行前不需要再build了,因為已經(jīng)通過maven build過了包。通過IDEA自帶的編譯器build,可能無法織入。或者選擇ajc作為編譯器。

具體請參考:IDEA啟動Springboot但AOP失效

訪問如下:

GET http://localhost:8080/test/hello

則日志如下,成功實現(xiàn)AOP功能:

3.6 一些遇到的錯誤

遇到錯誤:

ajc Syntax error, annotations are only available if source level is 1.5 or greater

需要配置插件:

<complianceLevel>${java.version}</complianceLevel>
<source>${java.version}</source>
<target>${java.version}</target>

可能還會遇到無法識別Lombok的錯誤,配置如下則解決該問題:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>aspectj-maven-plugin</artifactId>
  <version>1.14.0</version>
  <configuration>
    <complianceLevel>${java.version}</complianceLevel>
    <source>${java.version}</source>
    <target>${java.version}</target>
    <proc>none</proc>
    <showWeaveInfo>true</showWeaveInfo>
    <forceAjcCompile>true</forceAjcCompile>
    <sources/>
    <weaveDirectories>
      <weaveDirectory>${project.build.directory}/classes</weaveDirectory>
    </weaveDirectories>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>compile</goal>
      </goals>
    </execution>
  </executions>
</plugin>

4 總結(jié)

AOP場景應用特別多,還是需要掌握的。

代碼請看GitHub: github.com/LarryDpk/pk…

以上就是Spring AOP與AspectJ的對比及應用詳解的詳細內(nèi)容,更多關(guān)于Spring AOP對比AspectJ應用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java?Synchronized鎖的使用詳解

    Java?Synchronized鎖的使用詳解

    在多線程并發(fā)問題中,常用Synchronized鎖解決問題。本篇文章主要介紹了并發(fā)編程中Synchronized鎖的用法知識記錄,感興趣的小伙伴可以了解一下
    2022-10-10
  • Java中@JSONField注解用法、場景與實踐詳解

    Java中@JSONField注解用法、場景與實踐詳解

    這篇文章主要給大家介紹了關(guān)于Java中@JSONField注解用法、場景與實踐的相關(guān)資料,并結(jié)合實際應用場景,幫助開發(fā)者在項目中更高效地處理JSON數(shù)據(jù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • Java在PowerPoint幻燈片中創(chuàng)建散點圖的方法

    Java在PowerPoint幻燈片中創(chuàng)建散點圖的方法

    散點圖是通過兩組數(shù)據(jù)構(gòu)成多個坐標點,考察坐標點的分布,判斷兩變量之間是否存在某種關(guān)聯(lián)或總結(jié)坐標點的分布模式,這篇文章主要介紹了Java如何在PowerPoint幻燈片中創(chuàng)建散點圖,需要的朋友可以參考下
    2023-04-04
  • Dom4j解析xml復雜多節(jié)點報文方式

    Dom4j解析xml復雜多節(jié)點報文方式

    這篇文章主要介紹了Dom4j解析xml復雜多節(jié)點報文方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring高級注解之@DependsOn詳解

    Spring高級注解之@DependsOn詳解

    這篇文章主要介紹了Spring高級注解之@DependsOn詳解,@DependsOn注解可以定義在類和方法上,意思是我這個組件要依賴于另一個組件,也就是說被依賴的組件會比該組件先注冊到IOC容器中,需要的朋友可以參考下
    2024-01-01
  • 詳解java中if語句和switch的使用

    詳解java中if語句和switch的使用

    這篇文章主要介紹了java中if語句和switch的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • MyBatis中XML映射器的實現(xiàn)

    MyBatis中XML映射器的實現(xiàn)

    MyBatis的真正強大在于它的語句映射,映射器的XML文件就顯得相對簡單,本文主要介紹了MyBatis中XML映射器的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Spring Boot(二)之web綜合開發(fā)

    Spring Boot(二)之web綜合開發(fā)

    本篇文章為大家介紹spring boot的其它特性(有些未必是spring boot體系桟的功能,但是是spring特別推薦的一些開源技術(shù)本文也會介紹),對了這里只是一個大概的介紹,特別詳細的使用我們會在其它的文章中來展開說明
    2017-05-05
  • Java實現(xiàn)stream的三個常用方式(toMap,groupingBy,findFirst)

    Java實現(xiàn)stream的三個常用方式(toMap,groupingBy,findFirst)

    本文主要介紹了Java實現(xiàn)stream的三個常用方式,主要包括toMap,groupingBy,findFirst,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 基于springboot微信公眾號開發(fā)(微信自動回復)

    基于springboot微信公眾號開發(fā)(微信自動回復)

    這篇文章主要介紹了基于springboot微信公眾號開發(fā)(微信自動回復),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11

最新評論

微山县| 杭锦后旗| 苗栗县| 平果县| 武汉市| 定南县| 丰台区| 应用必备| 龙江县| 淮北市| 衡阳市| 虎林市| 兴义市| 嘉祥县| 阿勒泰市| 株洲县| 和顺县| 光山县| 彭山县| 张家口市| 美姑县| 水富县| 永登县| 锡林郭勒盟| 武功县| 阜新市| 客服| 抚松县| 绥滨县| 江源县| 广宗县| 青河县| 洛扎县| 赤壁市| 广昌县| 新干县| 岢岚县| 会理县| 招远市| 新疆| 广平县|