我已经经历了很多stackoverflow问题和AspectJ docs,并且在我的实现中必定存在一些微不足道的错误,因为我还没有发现任何涉及示例和文档的危险信号。
目标
定义一个自定义注释,作为方法调用的切入点(如果语义不在这里,请道歉,我希望这些示例有帮助)。
代码
请注意我已经更改了一些类名,使它们听起来很通用。
package com.example.so;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import java.util.HashSet;
@Aspect
public class CustomAspect {
private final HashSet<String> instanceProperty;
public CustomAspect(final HashSet<String> constructorArgument) {
this.instanceProperty = constructorArgument;
}
/* @Around("execution(* com.example.so.IService..*(..))")
public void beforeTransactionalMethod(ProceedingJoinPoint pjp) throws Throwable {
System.log.println("execution point-cut");
pjp.proceed();
}*/
// @Before("@annotation(java.lang.Override)")
@Before("@annotation(com.example.so.Custom)")
public void around() throws Throwable {
System.out.println("annotation");
}
}
方面界面:
package com.example.so;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Custom{
}
Spring配置
<aop:aspectj-autoproxy />
<bean id="customAspect" class="com.example.so.CustomAspect">
<constructor-arg ref="arg"/>
</bean>
使用方面:
(...)
@Override
@Custom
public void saveData(final Object data) {
// this is being called
}
(...)
POM,以防万一(版本1.6.11):
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
行为
如果我删除评论:
/* @Around("execution(* com.example.so.IService..*(..))")
public void beforeTransactionalMethod(ProceedingJoinPoint pjp) throws Throwable {
System.log.println("execution point-cut");
pjp.proceed();
}*/
这会被调用,但无论我做什么,我都无法使用我的自定义注释或其他方式调用注释切入点(这可能很愚蠢,但无论如何我都试过了):
//@Before("@annotation(java.lang.Override)")
@Before("@annotation(com.example.so.Custom)")
public void around() throws Throwable {
System.out.println("annotation");
}
有没有人有任何想法,我相信所有的配置都在那里,因为CustomAspect
在上下文中并且是活动的。我之前添加了组件标签,但我将其删除了,因为我认为在这种情况下它们没有意义。
提前谢谢。