当前位置: 首页 > 面试题库 >

带注释的方法或带注释的类中的方法的切入点

于恺
2023-03-14
问题内容

我需要 在类中使用@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()切入点分开之外,我还对结果切入点添加了限制,以使它们不会太宽。我想您想要 方法执行
连接点,所以我添加了所需的切入点表达式,将其限制为方法执行。他们是匹配的

  1. @X 在第一个建议中 ,在任何包中的任何类中的任何类中以任何返回类型 注释的任何方法的执行
  2. 在带有@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能够提供一些解决方案。有什么想法吗?