当前位置: 首页 > 知识库问答 >
问题:

使用没有Spring的AeyJ注释

谢泽语
2023-03-14

我对AOP相当陌生。我正在尝试使用AspectJ在没有Spring的maven项目中创建注释。然而,我试图使用@方面调用的方法没有被调用。

这就是我的pom看起来的样子:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

<groupId>test</groupId>
<artifactId>tanvi</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <!-- https://mvnrepository.com/artifact/aspectj/aspectjrt -->
    <dependency>
        <groupId>aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.5.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver -->
    <dependency>
        <groupId>aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.5.3</version>
    </dependency>
    <dependency>
        <groupId>aspectj</groupId>
        <artifactId>aspectjtools</artifactId>
        <version>1.5.3</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <configuration>
                <complianceLevel>1.8</complianceLevel>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
            <executions>
                <execution>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

注释如下所示:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface HasAccess {
    Access[] accesses();
    String message() default "You are not allowed to perform this operation";
}

我为我的注释创建了一个注释处理器:

@Aspect
public class HasAccessAdvice {
    //    @Before("execution(* *.*(..)) && @annotation(testAnnotation) ")
    @Before("execution(* *.*(..)) && @annotation(hasAccess)")
    public void myBeforeLogger(JoinPoint joinPoint, HasAccess hasAccess) {

    System.out.println("Okay - we're in the before handler...");
    System.out.println("The test annotation value is: " + hasAccess.accesses().toString());

    Signature signature = joinPoint.getSignature();
    String methodName = signature.getName();
    String stuff = signature.toString();
    String arguments = Arrays.toString(joinPoint.getArgs());
    System.out.println("Write something in the log... We are just about to call method: "
                       + methodName + " with arguments " + arguments + "\nand the full toString: "
                       + stuff);

}

}

我在这次通话中称之为:

public class TestMe {

    @HasAccess(accesses = {Access.CREATE_PURCHASE})
    public void createPurchase(BigDecimal bigDecimal) {
        System.out.println("create Purchase called");
    }
}

我创建了一个aop。xml文件,并将其放置在与pom相同的文件夹中。xml。

<aspectj>
    <aspects>
        <aspect name="HasAccessAdvice"/>
    </aspects>
</aspectj>

当我调用createPurchase方法时,它在没有首先调用@Before方法的情况下运行。请帮我弥补我所缺少的。我发现的大多数文档/答案都是Spring对齐的。任何指向任何教程的指针,或者甚至是没有Spring创建简单注释的其他方法,都将不胜感激。

共有1个答案

西门伟
2023-03-14

首先,由于您使用的是aop.xml,我假设您想进行加载时间编织。请参阅加载时间编织文档和不同编织类型的文档。

其次,在您的aop.xml文件中,您定义了哪个

<aspectj>
    <aspects>
        <aspect name="HasAccessAdvice"/>
    </aspects>
    <weaver options="-verbose">
        <!-- weave anything -->
        <include within="*" />
        <!-- weave specific packages only -->
        <include within="my.package..*" />
    </weaver>    
</aspectj>

使用“*”在任何类上运行aspect,或替换my。使用TestMe的包进行打包。请注意,双点<代码> 也包括子包
还要注意<代码>

第三,aop.xml必须在类路径的META-INF/aop.xml中可读。如果您通过CLI(使用java-javaagent...)运行测试,请检查您的类路径设置(-cp)。如果您正在编写JUnit测试,您可以将META-INF/aop.xml放在src/test/Resources中并调整

<properties>
    <aspectj.version>1.8.9</aspectj.version>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.9</version>
            <configuration>
                <argLine>
                    -javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
                </argLine>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

 类似资料:
  • 我有一个独立的aspectJ库(与Spring没有任何关系),我将其添加到应用服务器类路径中,以使用Load Time Weave监控正在运行的应用程序 方面可以与所有方法(域、服务、DAO…)完美结合但由于某些原因,即使切入点表达式与控制器类和方法名称匹配,它也无法识别带有@RequestMapping注释的Spring MVC方法 对于需要单独处理的Spring MVC控制器映射方法(或控制器

  • 嗨,我想排除带注释的方法,这里是代码。 排除任何用NoTryCatch注释的方法 上面的代码确实排除了用NoTryCatch注释的方法,但是当这个方法被异常调用时,它会停止下一个方法的执行。例如 现在我按顺序调用方法 test1()不运行。 如果我删除test1()运行

  • 我有一个使用的实现,但这与spring中的其他自动工作冲突,并覆盖了应用程序自身的一些逻辑。对于本应简单的东西来说,它也显得难以置信的沉重。我现在正在尝试: 但是,拦截器注册的实例似乎与应用程序实际用于web请求的实例完全不同。此外,当作为实现时,当我尝试时,在中获得

  • pom.xml 如果我从库代码中删除Autowired并正常创建对象(使用new关键字),一切都很好。所以我的问题是,为了使用注释,需要带有@SpringBootApplication的Main类,没有Main类我们不能运行它吗?

  • 我喜欢用于bean声明等的注释,但现在我们有这么多具有顺序的bean(@取决于)。很难维护或浏览配置。 是否有任何工具可以根据您的所有bean注释提供“有效的Spring配置”信息?

  • 所以我想要一个“Void Repository”,通过它可以访问不一定在实体上操作的存储过程。 但这当然不起作用,因为期望是一个实体。 有没有一种方法可以使用注释而无需创建虚拟实体,或者我是否坚持使用使用通过准备好的语句进行查询的已实现类? 因为老实说,这很难看: