我需要 在类中使用@X注释的方法或使用@X注释的方法的切入点 。我还 需要注释对象 。如果同时注释了类和方法,则
我更喜欢将方法注释作为参数 。
我尝试了以下操作,这将创建“不一致的绑定”警告。(为什么不将它们设置为null?)
@Around("@annotation(methodLevelX) || @within(classLevelX)")
public Object advise(ProceedingJoinPoint pjp, X methodLevelX, X classLevelX)
下面创建“跨’||’的参数x的模糊绑定 在切入点”警告。(我认为这并不一定有意义:为什么不绑定第一个短路评估?)
@Around("@annotation(x) || @within(x)")
public Object advise(ProceedingJoinPoint pjp, X x)
如果存在类和方法注释,则将先前的尝试自然地分为两部分会导致两个方法调用。
我知道我可以通过反射获取方法和类,并通过如下所示的切入点获取所需的批注:
@Around("@annotation(com.package.X) || @within(com.package.X)")
但是我不想。
对于我的不需要反射的需求,是否有“一个切入点,一个方法,一个注释参数”的html" target="_blank">解决方案?
不完全是,但是差不多。您将需要两个切入点,两个建议,但是您可以将工作委托给一个方法。看起来像这样:
@Aspect
public class AnyAspectName {
@Pointcut("execution(@X * *.*(..))")
void annotatedMethod() {}
@Pointcut("execution(* (@X *).*(..))")
void methodOfAnnotatedClass() {}
@Around("annotatedMethod() && @annotation(methodLevelX)")
public Object adviseAnnotatedMethods(ProceedingJoinPoint pjp, X methodLevelX)
throws Throwable {
return aroundImplementation(pjp, methodLevelX);
}
@Around("methodOfAnnotatedClass() && !annotatedMethod() && @within(classLevelX)")
public Object adviseMethodsOfAnnotatedClass(ProceedingJoinPoint pjp, X classLevelX)
throws Throwable {
return aroundImplementation(pjp, classLevelX);
}
public Object aroundImplementation(ProceedingJoinPoint pjp, X annotation)
throws Throwable {
return pjp.proceed();
}
}
请注意,除了将@annotation()
和@within()
切入点分开之外,我还对结果切入点添加了限制,以使它们不会太宽。我想您想要 方法执行
连接点,所以我添加了所需的切入点表达式,将其限制为方法执行。他们是匹配的
@X
在第一个建议中 ,在任何包中的任何类中的任何类中以任何返回类型 注释的任何方法的执行@X
_第二个 _注释的任何类中具有返回类型的任何方法的执行 。进一步的限制@within(X)
并@annotation(X)
派上用场,因为@within(X)
它本身会匹配
在类型中使用类型注释定义关联代码的任何连接点
X
其中包括 方法执行 , 方法调用 , 构造函数执行 , 构造函数调用 , 预初始化 , 静态初始化 , 初始化 , 字段集
, 字段get , 异常处理程序 , 锁 类型连接点(并非所有连接点都对 周围的建议 )。同样,@annotation(X)
本身意味着
主题具有类型注释的任何连接点
X
这也可能意味着前面提到的大多数连接点,具体取决于注释的目标类型。
对于用@X注释的类中的方法或用@X注释的方法,我需要一个切入点。我还需要注释对象。如果类和方法都被注释,我更喜欢将方法注释作为参数。 我尝试了以下操作,这会产生“绑定不一致”的警告。(为什么不直接将其设置为null?) 以下内容创建了“穿过切入点中的“||”的参数x的不明确绑定”警告。(在我看来,这不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将前面的尝试拆分为两个,自然会
add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案:
服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?
我正在使用Spring的AspectJ和CGLIB代理。我有一个定义如下的方面,我希望它在具体的类上为公共方法提供建议,这些类是用批注“validatormethod”批注的:
问题内容: 如果满足以下条件,则需要创建一个与方法匹配的切入点的方面: 它用MyAnnotationForMethod注释 它的参数之一(可以有多个)用@MyAnnotationForParam注释(但也可以具有其他注释)。 方面类看起来像这样 注释方法 随着日食->警告:在poincut: 使用http://download.eclipse.org/tools/ajdt/35/update中的最
我尝试在DAO中使用带有Spring注释的,但遇到了这样的问题: 工作正确: 例外: 如何使用parallelStream()注释的事务方法? 更新为什么会发生这种情况Spring事务管理器和多线程,但我希望支持java 8的Spring 4能够提供一些解决方案。有什么想法吗?