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

使用spring aop加载时编织处理方法本身内部调用时出现的问题

慕鸿波
2023-03-14

我的商务课如下:

class A {
    public void sayHello(String name){
        System.out.println("hello "+name);
    }
    public void openDoorForJack(){
        System.out.println("door opened");
        this.sayHello("Jack");
    }
}

和方面类如下:

@Aspect
class Aspect {
    @Pointcut("execution (* com..*.sayHello(String)) && args(name)")
    public void beforeSayHelloPointCut(String name) {}
    @Before("beforeSayHelloPointCut(name)")
    public void beforeSayHello(String name) throws Throwable {
        System.out.println(name+" is knocking");
    }
}

在spring中配置完所有这些bean之后,我使用

<aop:aspectj-autoproxy/>
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>

当然,aspectjrt、aspectj weaver、spring instrument已经就位,-javaagent:path/spring instrument。jar被传递给VM选项并遵循aop。xml在META-INF下

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!-- only weave classes in specific packages -->
        <include within="*"/>
    </weaver>

    <aspects>
        <!-- weave in just this aspect -->
        <aspect name="com.Aspect"/>
    </aspects>
</aspectj>

当我像这样运行测试时:

applicationContext.getBean(A.class).sayHello("Jack");

结果似乎很完美

Jack is knocking
Hello Jack

但当我运行测试时,它会在内部呼叫sayHello

applicationContext.getBean(A.class).openDoorForJack();

根本没有发生拦截

door opened
Hello Jack

我使用LTW的原因是,我希望也可以拦截使用“this”或“super”的方法调用,但似乎我没有这样做。有人能帮我指出问题所在吗?我是否遗漏了什么?

----------------------------编辑---------------------------------
经过一些调试后,我发现我错了
在现实生活中,
我有包下的“类A”com.bussiness
和包下的“类方面”com.aspect
我aop.xml如下

<weaver>
      <!-- only weave classes in specific packages -->
      <include within="com.aspect.*"/>
</weaver>

这是不正确的,应该是包含需要编织的类的包,在我将其更改为

<weaver>
      <!-- com package and its sub package all get woven-->
      <include within="com..*"/>
</weaver>

它终于起作用了

共有1个答案

景靖琪
2023-03-14

尝试动态代理,它应该可以工作。这并不容易,但我认为这正是你所需要的。

更多信息:如何使用AOP截获super中对参数的方法调用?

 类似资料:
  • 问题内容: 我需要为应用程序的某些部分向现有应用程序添加插件功能。我希望能够在运行时添加jar,并且应用程序应该能够从jar中加载类,而无需重新启动应用程序。到目前为止,一切都很好。我使用URLClassLoader在线找到了一些示例,并且运行良好。 我还希望能够在罐子的更新版本可用时重新加载相同的类。我再次发现了一些示例,据我所知,实现此目标的关键是我需要为每个新负载使用一个新的类加载器实例。

  • 但我的问题是,如果它不使用AspectJ进行编织,那么Spring AOP是否有自己的编织,它是在加载时还是编译时执行? 我的Spring配置XML文件的相关部分是:

  • 我正在尝试使用OpenCV的缝合算法缝合从OpenMV H7相机拍摄的一些图像。我遇到了无法写入或读取这些图像的问题,这让我觉得存在一些兼容性问题。 更确切地说,我在使用方法(cv2.imwrite)本身时得到了这个错误: 我一直在想,也许有一种方法可以将图像转换为NumPy数组以使其兼容,但我不太确定。 有什么建议吗?

  • 我想从AlertDialog的setPositiveButton()方法内部的片段调用一个方法,该方法用于返回DialogFragment的对话框,但不能这样做。 我在一个名为Test的类中有doSomething()方法,该类扩展了Fragment。在这个类中,我有一个扩展DialogFragment的内部类。在方法onCreateDialog中,问题就发生在这里。查看代码: 对话片段和片段来自

  • 我在SVN的Eclipse上有一个新的Java项目,刚刚尝试在Eclipse的项目资源管理器窗口中打开该项目,并收到此错误: 从插件调用代码时出现问题:< code>"org.eclipse.jface"。 我如何解决这个问题? 异常堆栈跟踪: 会话数据: