对于用@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)")
但是我不想。
对于我的需求,是否有“一个切入点、一个方法、一个注释参数”的解决方案不需要反射
不完全是,但几乎是。您将需要两个切入点和两个建议,但您可以将工作委托给单个方法。下面是它的样子:
@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
注释的类中执行任何返回类型的任何方法。进一步限制(X)内的@和注释(X)
很方便,因为(X)内的@本身会匹配
在具有类型
X
注释的类型中定义关联代码的任何连接点
其中包括方法执行、方法调用、构造函数执行、构造函数调用、预初始化、静态初始化、初始化、字段集、字段获取、异常处理程序、锁类型连接点(但并非所有连接点都对周围通知有效)。类似地,
@注释(X)
本身意味着
主题具有
X
类型注释的任何连接点
这也可能意味着前面提到的大多数连接点,具体取决于注释的目标类型。
问题内容: 我需要 在类中使用@X注释的方法或使用@X注释的方法的切入点 。我还 需要注释对象 。如果同时注释了类和方法,则 我更喜欢将方法注释作为参数 。 我尝试了以下操作,这将创建“不一致的绑定”警告。(为什么不将它们设置为null?) 下面创建“跨’||’的参数x的模糊绑定 在切入点”警告。(我认为这并不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将先前的尝试自然地分
add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案:
我有以下问题: 我已经为安全性创建了注释: 在我具有类之间的继承性的情况下,是否也有可能所有类都具有@Security注释来获得最具体的定义? 约西
我正在使用Spring的AspectJ和CGLIB代理。我有一个定义如下的方面,我希望它在具体的类上为公共方法提供建议,这些类是用批注“validatormethod”批注的:
试图收集和理解@事务性注释的要点并越过了一点。因此,在使用事务性注释时,我们需要记住的主要事情是: 事务注释只能应用于公共方法[根据Spring@Transactional属性对私有方法起作用吗? 事务性注释应该应用于具体的类,而不是接口[根据我应该将@transactional annotation放在接口定义还是实现类的位置? 事务注释应应用于服务级别[根据Spring@Transaction
服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?