如何在另一个Spring项目中使用在第一个Spring项目中创建的带有aspectj @Aspect的注释?

问题描述 投票:0回答:1

我使用aspectj Aspect 创建了一个名为@ProjectAudit 的注释。我在名为projectaudit的maven项目中做到了这一点。

我的 ProjectAudit 注释是:

package com.example;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.example.ProjectAuditAction;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ProjectAudit{
    ProjectAuditAction action() default ProjectAuditAction.ACCESS;
}

与 ProjectAuditAction :

package com.example;
public enum ProjectAuditAction {
    LOGIN,
    ACCESS
}

Aspect 是这样写的:

...
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Service;

@Service
@Aspect
@ComponentScan
public class ProjectAuditAspect {

    static {
        System.out.println("I am here");
    }

    @Pointcut("@annotation(com.example.annotation.ProjectAudit)")
    public void projectAuditAnnotatedMethodExecution() {
    }

    @Before("projectAuditAnnotatedMethodExecution()")
    public void auditProjectAuditBean(JoinPoint point) {
        System.out.println("Entering audit");

        MethodSignature signature = (MethodSignature) point.getSignature();

        Method method = null;
        try {
            method = point.getTarget()
                .getClass()
                .getMethod(signature.getMethod().getName(), signature.getMethod().getParameterTypes());
        } catch (Exception e) {

        }

        System.out.println(method);
    }
}

以及依赖关系:

<dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.19</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.19</version>
        </dependency>
    </dependencies>

当我在本地进行测试时,它正在工作。

但我的目标是在另一个名为projectcontroller的maven项目中使用这个注释。在新项目中,我添加了projectaudit依赖项。

在另一个maven项目的配置中,我做了一个@ComponentScan来创建bean。

@Configuration
@ComponentScan(basePackages = "com.example.projectaudit") 
public class ProjectAuditConfiguration {
}

我只是将注释放在像这样的方法之前:

@ProjectAudit(action = ProjectAuditAction.ACCESS)
    public void getScore() {
        System.out.println("i am in getScore");
    }

当我在项目控制器中测试时,我从未看到“进入审核”,我只看到“我在这里”,这表明 bean 已创建良好,但注释从未被重新确认。

我想使用第一个项目中创建的注释在另一个项目中拥有自定义审核注释

谢谢!!

annotations aop spring-aop
1个回答
0
投票

首先,从你的方面移除

@Service
,转而使用
@Component
。方面不是服务。它也不是一个配置类,所以也请从中删除
@ComponentScan

接下来,在使用aspect的项目中,一定要扫描aspect的基础包,例如在您的示例代码中

com.example
。如果您在子包
com.example.projectaudit
中开始扫描,应用程序将找不到该方面。

@Configuration
@ComponentScan(basePackages = "com.example") 
public class ProjectAuditConfiguration {}

如果您的方面库位于单独的命名空间中,例如

org.acme.aspect.audit
,你也可以做类似的事情

@Configuration
@ComponentScan({ "com.example.myapp", "org.acme.aspect.audit" })
public class ProjectAuditConfiguration {}

在这个例子中,我省略了参数名称

basePackages
,因为为了方便起见,默认的
value
是它的别名。

如果这不起作用,则问题出在您应用程序的另一部分。在这种情况下,请在 GitHub 上发布一个最小的重现器项目。

© www.soinside.com 2019 - 2024. All rights reserved.