非spring如果使用切面aop

目錄

一、介紹

二、Demo

2.1 pom.xml 里面 引入相關(guān)的依賴和插件

2.2 再建一個 Aspect

2.3 建一個對應(yīng)的 service 類

2.4 編譯

2.5 運行

三、涉及點

3.1 includes 功能有缺陷

3.2 和 lombok 有沖突

一、介紹

本文介紹的 aspectj-maven-plugin 插件 和 我們 大部分使用的 Spring Aop 不同, 我們通常會在 帶有 @Aspect 注解的類上面 加上 @Service或者 @Component 注解,這樣就可以 被Spring 管理 ,這樣可以通過Aop 進(jìn)行一些攔截.

但是有時 有一個接口沒有在spring 注冊, 但是也要對其攔截, 便可以使用 aspectj-maven-plugin, aspectj-maven-plugin 的相關(guān)介紹 aspectj-maven-plugin 的相關(guān)介紹 , 對應(yīng)的GitHub 地址 GitHub地址

aspectj-maven-plugin 插件是在 編譯階段 compile 對文件進(jìn)行增強(qiáng). ,可以從 生成的.class 文件可以看出.

其實從上面 兩個網(wǎng)址就完全可以 找到自己需要的信息,本文只是記錄一下相關(guān)使用 以及 對應(yīng)的includes 標(biāo)簽 功能上有一些缺陷, 如果有人 了解,還請指點。

二、Demo

2.1 pom.xml 里面 引入相關(guān)的依賴和插件

針對這里面的配置 相關(guān)解釋一下, 我用的 是IDEA 工具,不是Eclipse , IDEA 對這個插件有一些支持不太友好.

默認(rèn)為 false, 這里設(shè)置true,是 為了不讓IDEA 編譯, 但是 使用 Maven 或者 Jenkins 打包上線是沒有問題的, 如運行 命令:mvn clean compile(或者其他的 mvn clean package 都是可以的) , 主要是IDEA 編譯運行時 里面的配置不生效, 但是在maven 里面 是會進(jìn)行替換掉的.

這里我選擇的是 1.8 ,對應(yīng)的是 aspectjtools 1.8.13 版本, 不同的版本是有一定的區(qū)別的,這里也需要注意.

這里是信息的顯示和忽略一些告警

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.13</version>
        </dependency>

   .   . .  .

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.11</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <source>1.8</source>
                    <target>1.8</target>
                    <showWeaveInfo>true</showWeaveInfo>
                  <Xlint>ignore</Xlint>
                    <encoding>UTF-8</encoding>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <configuration>
                            <skip>false</skip>
                        </configuration>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

2.2 再建一個 Aspect

@Aspect
public class MethodEndAspect {

    @Before("execution(* com.test.service.UserServiceEnd.printLog())")
    public void setStartTimeInThreadLocal(JoinPoint joinPoint) {
        System.out.println("before ...");
    }


}

2.3 建一個對應(yīng)的 service 類

public class UserServiceEnd {
    public void printLog(){
        System.out.println(" no param.....");
    }
}

2.4 編譯

輸入 編譯命令,mvn clean compile

從提示可以看出 進(jìn)行了增強(qiáng), 同時 打開對應(yīng)的 .class 文件可以看出 也做了增強(qiáng).

2.5 運行

成功進(jìn)行攔截,在控制臺 打印出了 相應(yīng)的日志

有人可能調(diào)試 不成功, 這里把 true 改成 false ,這樣 IDEA 就會用 Ajc 去編譯, 而不是默認(rèn)的javac , 也可以手動 調(diào)整, 具體在 :

三、涉及點

使用也比較簡單, 但是里面有2點不太友好

3.1 includes 功能有缺陷

從官方文檔 官方文檔 ,進(jìn)行測試,單純的 include 某一個 aspect 是不生效的(exclude 是可以的),還需要具體指定 source 的地址, 即需要指定 使用的 地方,也就是 還要 配合 或者 標(biāo)簽使用, 個人感覺這個很不友好, 為啥不能使用默認(rèn)的 basedir 呢

3.2 和 lombok 有沖突

如果你在編譯的時候出現(xiàn)下面的信息, 那就是和lombok 沖突, 網(wǎng)上也有很多的做法啦,具體可以自行Googole,百度現(xiàn)在 搜的東西質(zhì)量越來越差.

java web 極速 框架fastboot 0.5.1上線

redis java客戶端那么多,該選擇哪一個

深入剖析Spring boot自動裝配原理

架構(gòu)設(shè)計時,如何通過 maven or Gradle 來制作一個 BOM 管理jar依賴版本

作者:java知路


歡迎關(guān)注微信公眾號 :java知路