我对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创建简单注释的其他方法,都将不胜感激。
首先,由于您使用的是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”,通过它可以访问不一定在实体上操作的存储过程。 但这当然不起作用,因为期望是一个实体。 有没有一种方法可以使用注释而无需创建虚拟实体,或者我是否坚持使用使用通过准备好的语句进行查询的已实现类? 因为老实说,这很难看: