微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – IntelliJ IDEA AspectJ

我试图在IntelliJ IDEA的示例项目中使用AspectJ.我有使用 Spring AOP的经验,但这是我第一次使用AspectJ,并且无法使其工作.

我想按照这里描述的方式去做:https://www.jetbrains.com/help/idea/2017.1/aspectj.html

我的build.gradle:

apply plugin: 'java'

repositories
{
    mavenCentral()
}

dependencies
{
    compile "org.projectlombok:lombok:+"

    compile "org.aspectj:aspectjrt:+"
    compile "org.aspectj:aspectjweaver:+"
    compile "org.aspectj:aspectjtools:+"
}

buildscript
{
    repositories
    {
        maven
        {
            url "https://maven.eveoh.nl/content/repositories/releases"
        }
    }

    dependencies
    {
        classpath "nl.eveoh:gradle-aspectj:+"
    }
}

project.ext
{
    aspectjVersion = '+'
}

apply plugin: 'aspectj'

我的方面:

package aspects;

import lombok.SneakyThrows;
import lombok.experimental.FieldDefaults;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.Arrays;

@Aspect
@FieldDefaults(makeFinal = true)
public aspect LoggingAspect
{
    Journal journal = Journal.INSTANCE;

    pointcut all(ProceedingJoinPoint proceedingJoinPoint) : execution(* * set*(..) );

    around() : all(ProceedingJoinPoint proceedingJoinPoint)
    {
        System.out.println("asd");
    }

    @SneakyThrows
    @Around("execution(* * repository.*.*(..))")
    public Object log(ProceedingJoinPoint proceedingJoinPoint)
    {
        journal.write(proceedingJoinPoint.getThis().getClass().getCanonicalName());
        journal.write("\n");

        String arguments = Arrays
            .stream(proceedingJoinPoint.getArgs())
            .map(o -> o.getClass().getCanonicalName() + " " + o.toString())
            .reduce(new StringBuilder(),StringBuilder::append,StringBuilder::append)
            .toString();

        journal.write(arguments);
        journal.write("\n");

        long start = System.currentTimeMillis();

        Object result = proceedingJoinPoint.proceed();

        journal.write(result.toString());
        journal.write("\n");

        journal.write(String.valueOf(System.currentTimeMillis() - start));
        journal.write("\n\n");
        journal.flush();

        return result;
    }
}

样本类:

package repository;

import java.io.Serializable;

public class Task implements Serializable
{
    private static final long serialVersionUID = 1L;

    enum Status {NEW,IN_PROGRESS,FINISHED};

    private Integer id;
    private String description;
    private Employee assignee;
    private Employee reporter;
    private Status status;

    public Task(final Integer id,String description,final Employee assignee,final Employee reporter) {
        this.id = id;
        this.assignee = assignee;
        this.reporter = reporter;
        this.description = description;
        this.status = Status.NEW;
    }

    public Employee getAssignee() {
        return assignee;
    }

    public void setAssignee(Employee assignee) {
        this.assignee = assignee;
    }

...
}

我有IntelliJ IDEA Ultimate 2017.2,它正确地暗示所有方法(吸气剂和制定者)都是我的减产.它还暗示我,对于我的方面的“日志”建议,有多个减少点.但是,它没有暗示“所有”建议.

我安装了(在最新版本中)插件,如:
– AspectJ支持
– AspectJ weaver
– Spring AOP / @ AspectJ

Gradle依赖项自动为此项目创建库,因此我没有复制它.

我启用了:Build> AspectJ编织.

设置>构建,执行,部署>编译器> Java编译器:

使用编译器:ajc

Ajc编译路径:/home/me/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjtools/1.8.10/5c5957ee4615bde33b54ce965f5b85b8827b97d5/aspectjtools-1.8.10.jar

命令行参数:为空

生成调试信息:已选中

委托给javac:chcecked

启用注释处理选项:选中

项目构建和编译没有问题.它运行就像从来没有任何方面,特殊性没有从方面打印出来,也没有创建临时文件,并且所有方法运行良好(尽管在我的“所有”建议中,我没有处理关节点).

当我在任何建议的第一行创建断点并使用调试器运行项目时,不会捕获任何内容.

我错过了什么?

解决方法

在浪费了更多时间之后,我发现我将两个截然不同的AspectJ sytnax混合在一起.

一个是方面(如“public aspect LoggingAspect”),第二个是常规Java注释(如“@Aspect”或“@Around”).

当我用“公共类LoggingAspect”替换“public aspect LoggingAspect”时,它起作用了.很难找到,因为一切仍然没有问题编译.

希望它有一天能帮到某人,或者至少在将来的ajc版本中会增加更多详细的编译器输出.

原文地址:https://www.jb51.cc/idea/129863.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐