当前位置: 首页 > 知识库问答 >
问题:

带注释的构造函数对象的Spring-AspectJ切入点

谷梁子昂
2023-03-14

这就是我的目标:

@Controller
public class ApplicationController {
    public ApplicationController(String myString, MyObject myObject) {
        ...
    }
    ...
    ..
    .
}

这是我的Aspect类:

@Aspect
@Component
public class CommonLogAspect implements ILogAspect {
    Logger log = Logger.getLogger(CommonLogAspect.class);

    // @Before("execution(my.package.Class.new(..)))
    @Before("execution(* *.new(..))")
    public void constructorAnnotatedWithInject() {
        log.info("CONSTRUCTOR");
    }
}

如何为构造函数对象创建切入点?

共有1个答案

孟自强
2023-03-14

Sotirios Delimanolis是对的,因为Spring AOP不支持构造函数拦截,所以您确实需要完整的AspectJ。Spring手册第9.8章将AspectJ与Spring应用程序一起使用,描述了如何将其与LTW(加载时编织)一起使用。

此外,您的切入点还有一个问题

@Before("execution(* *.new(..))")

构造函数不像AspectJ语法中的方法那样具有返回类型,因此需要删除前面的*:

@Before("execution(*.new(..))")
 类似资料:
  • 问题内容: 我需要使用AspectJ向每个初始化的对象注入一些方法。 我以为是这样的: 指向对象的切入点初始化,因此我可以将这些方法直接注入到每个其他对象的对象中。 但是,它不起作用。你知道为什么吗?还是另一种方法可以如何100%确保每个初始化的对象都将成为切入点?* .new不适用于String,List等。 谢谢! 问题答案: 用户selig是正确的:您可能不想截取 所有 对象,尤其是JDK

  • 对象的切入点初始化,所以我可以直接将这些方法注入到作为每一个其他对象的一部分的对象中。 然而,它不起作用。你知道为什么吗?或者有什么其他方法可以100%地确保每个初始化的对象都是切入点?*.new不适用于字符串、列表等内容。 谢谢!

  • 我试图在方法注释上创建一个Aeyj切入点,但我总是用不同的方法失败。我使用的是aspectj自动代理(我在Spring上下文中没有配置其他编织)。我的类如下所示: 所以我想知道为什么aspectj不会创建切入点。我设法使用执行(**(…)使其工作抛出一些exc)这对我来说很好,但我仍然想知道我做错了什么。 另外,由于是在接口中定义的,我指定了实现类的注释,有没有办法让它以这种方式工作?其他代理机制

  • 我想拦截所有用特定注释注释类的构造函数调用。 我有这样一个方面: 还有一个例子: 现在,如果我更改方面并删除@注释过滤器,那么我看到aspectj正在拦截调用。此外,如果我创建一个默认构造函数,然后用注释对其进行注释,它也可以工作。 但是,我希望注释存在于类中,这样如果我有1个构造函数或10个,它们都将被相同地拦截(我只需要将其放在类中)。

  • 服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?

  • 假设我有这样一种方法: 是否有一个切入点表达式可以选择所有参数带有@CustomAnnotation注释的方法?如果是这样的话,有没有一种方法可以让我访问“value”参数?