非spring如果使用切面aop

目录

一、介绍

二、Demo

2.1 pom.xml 里面 引入相关的依赖和插件

2.2 再建一个 Aspect

2.3 建一个对应的 service 类

2.4 编译

2.5 运行

三、涉及点

3.1 includes 功能有缺陷

3.2 和 lombok 有冲突

一、介绍

本文介绍的 aspectj-maven-plugin 插件 和 我们 大部分使用的 Spring Aop 不同, 我们通常会在 带有 @Aspect 注解的类上面 加上 @Service或者 @Component 注解,这样就可以 被Spring 管理 ,这样可以通过Aop 进行一些拦截.

但是有时 有一个接口没有在spring 注册, 但是也要对其拦截, 便可以使用 aspectj-maven-plugin, aspectj-maven-plugin 的相关介绍 aspectj-maven-plugin 的相关介绍 , 对应的GitHub 地址 GitHub地址

aspectj-maven-plugin 插件是在 编译阶段 compile 对文件进行增强. ,可以从 生成的.class 文件可以看出.

其实从上面 两个网址就完全可以 找到自己需要的信息,本文只是记录一下相关使用 以及 对应的includes 标签 功能上有一些缺陷, 如果有人 了解,还请指点。

二、Demo

2.1 pom.xml 里面 引入相关的依赖和插件

针对这里面的配置 相关解释一下, 我用的 是IDEA 工具,不是Eclipse , IDEA 对这个插件有一些支持不太友好.

默认为 false, 这里设置true,是 为了不让IDEA 编译, 但是 使用 Maven 或者 Jenkins 打包上线是没有问题的, 如运行 命令:mvn clean compile(或者其他的 mvn clean package 都是可以的) , 主要是IDEA 编译运行时 里面的配置不生效, 但是在maven 里面 是会进行替换掉的.

这里我选择的是 1.8 ,对应的是 aspectjtools 1.8.13 版本, 不同的版本是有一定的区别的,这里也需要注意.

这里是信息的显示和忽略一些告警

        <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 建一个对应的 service 类

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

2.4 编译

输入 编译命令,mvn clean compile

从提示可以看出 进行了增强, 同时 打开对应的 .class 文件可以看出 也做了增强.

2.5 运行

成功进行拦截,在控制台 打印出了 相应的日志

有人可能调试 不成功, 这里把 true 改成 false ,这样 IDEA 就会用 Ajc 去编译, 而不是默认的javac , 也可以手动 调整, 具体在 :

三、涉及点

使用也比较简单, 但是里面有2点不太友好

3.1 includes 功能有缺陷

从官方文档 官方文档 ,进行测试,单纯的 include 某一个 aspect 是不生效的(exclude 是可以的),还需要具体指定 source 的地址, 即需要指定 使用的 地方,也就是 还要 配合 或者 标签使用, 个人感觉这个很不友好, 为啥不能使用默认的 basedir 呢

3.2 和 lombok 有冲突

如果你在编译的时候出现下面的信息, 那就是和lombok 冲突, 网上也有很多的做法啦,具体可以自行Googole,百度现在 搜的东西质量越来越差.

java web 极速 框架fastboot 0.5.1上线

redis java客户端那么多,该选择哪一个

深入剖析Spring boot自动装配原理

架构设计时,如何通过 maven or Gradle 来制作一个 BOM 管理jar依赖版本

作者:java知路


欢迎关注微信公众号 :java知路