问题标签 [spring-aop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
7113 浏览

java - Spring @Transactional 既可用作动态 Jdk 代理,也可用作 aspectj 方面

我正在通过 @Transactional 注释将 Spring 声明性事务添加到现有 Java 项目中。

当我遇到问题(与此问题无关)时,我打开了完整的调试日志记录。奇怪的是,我注意到以下内容:

经过一些调试,我发现前三个日志条目(它说它找到了一个线程绑定会话并正在使用该事务)是由我的 UserService 类上的 JdkDynamicAopProxy 生成的。

不过,最后一条日志消息看起来令人震惊。它在方法执行之前的连接点处被调用。查看 AnnotationTransactionAspect 的源时,如果未设置事务管理器,它会生成此消息。在这种情况下,因为 Spring 从未在这方面执行任何依赖注入。

在我看来,两种不同的交易“风格”都被应用了:动态代理和方面。我拥有的唯一与事务相关的配置是:

我们在项目中使用的是 AspectJ,但是我的 aop.xml 中没有注册 AnnotationTransactionAspect 方面。我们正在使用 Spring 3.0.2.RELEASE。

我应该对此感到震惊吗?Spring 是否为我注册了这方面?annotation-driven使用 AspectJ 时不应该使用吗?

0 投票
1 回答
6350 浏览

java - 带有 Spring AOP 的 BeanNotOfRequiredTypeException

我正在尝试使用 spring aop 和 spring 配置文件:

当我运行代码时,我收到错误消息:

线程“主”org.springframework.beans.factory.BeanNotOfRequiredTypeException 中的异常:名为“eddie”的 Bean 必须属于 [com.springinaction.Instrumentalist] 类型,但实际上在 org.springframework.beans.factory 中属于 [$Proxy4] 类型.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:348) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java :1008) 在 com.springinaction.Main.main(Main.java:12)

如果我<aop:config>在 spring 配置文件中评论元素它运行完美..

为什么会这样?

0 投票
1 回答
4507 浏览

spring - Spring 表达式语言不适用于 spring aop

在上面的代码中,我正在使用 Spring 表达式语言注入 beansonginstrument属性。eddie但是,song属性没有正确注入..我收到以下错误:

线程“主”org.springframework.beans.factory.BeanCreationException 中的异常:在类路径资源 [spring-config.xml] 中定义名称为“eddie”的 bean 创建错误:bean 初始化失败;嵌套异常是 org.springframework.beans.factory.BeanExpressionException:表达式解析失败;嵌套异常是 org.springframework.expression.spel.SpelEvaluationException:EL1008E:(pos 6):在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory 的“$Proxy4”类型的对象上找不到字段或属性“歌曲”。 doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) 在 org.springframework.beans。

乐器属性被正确注入,因为歌曲属性没有被注入,这只是因为 aop..

当我评论<aop:config>它工作正常..

哪里不对了?

0 投票
3 回答
6383 浏览

java - AspectJ 加载时间编织器未检测到所有类

我在“aspectj”模式下使用 Spring 的声明性事务(@Transactional 注释)。在大多数情况下,它的工作原理与应有的完全一样,但对于其中一种情况却没有。我们可以调用它Lang(因为它实际上是这样调用的)。

我已经能够将问题定位到加载时间编织器。通过在 aop.xml 中打开调试和详细日志记录,它列出了所有正在编织的类。Lang日志中确实根本没有提到有问题的类。

然后我在 的顶部放了一个断点Lang,导致 Eclipse 在Lang加载类时挂起线程。这个断点在 LTW 编织其他类时被命中!所以我猜它要么尝试编织Lang并且失败并且不输出它,或者其他一些类有一个引用,它Lang在它实际有机会编织它之前强制它加载。

但是我不确定如何继续调试它,因为我无法以较小的规模重现它。关于如何继续的任何建议?


更新:也欢迎其他线索。例如,LTW 实际上是如何工作的?似乎发生了很多魔术。是否有任何选项可以从 LTW 获得更多调试输出?我目前有:


我忘了汤姆之前提到过:spring-agent被用来允许 LTW,即InstrumentationLoadTimeWeaver.


根据 Andy Clement 的建议,我决定检查 AspectJ 变压器是否通过了课程。我在 中放了一个断点,尽管它是由与其他类相同的类加载器(Jetty 的 WebAppClassLoader 的一个实例)加载的,但该类ClassPreProcessorAgent.transform(..)似乎甚至从未到达该方法。Lang

然后我继续在InstrumentationLoadTimeWeaver$FilteringClassFileTransformer.transform(..). 甚至没有被击中Lang。而且我相信应该为所有加载的类调用该方法,无论它们使用什么类加载器。这开始看起来像:

  1. 我的调试有问题。可能Lang在 Eclipse 报告它的时候没有加载
  2. 爪哇错误?有点牵强,但我想它确实会发生。

下一条线索:我打开了电源-verbose:class,它似乎Lang 过早地加载了——可能是在将变压器添加到 Instrumentation 之前。奇怪的是,我的 Eclipse 断点没有捕捉到这个加载。

这意味着 Spring 是新的嫌疑人。似乎有一些处理ConfigurationClassPostProcessor加载类来检查它们。这可能与我的问题有关。


这些行ConfigurationClassBeanDefinitionReader导致Lang类被读取:

特别是对类的metadata.hasAnnotatedMethods()调用getDeclaredMethods(),它会加载该类中所有方法的所有参数类。我猜这可能不是问题的结束,因为我认为这些类应该被卸载。JVM 会因为不可知的原因缓存类实例吗?

0 投票
4 回答
6578 浏览

java - 私有方法上的方法拦截器

这是一个问题:我有方法digest(byte[] data)。它应该是私有的,因为我们在课堂之外真的不需要它,但是如果我把它公开,我不会死的,如果它有帮助的话。
问题是:我能以某种方式附加拦截器吗?问题是它没有被称为 like getBean('MyBean').digest(),它是通过getBean('MyBean').sign(data)where sign is smth like来调用的

谢谢。

0 投票
1 回答
847 浏览

java - 为什么 Spring AOP 需要代理类?

AOP 中代理类的职责是什么?它的作用是什么?

0 投票
1 回答
1203 浏览

java - 如何使用spring aop自动设置date_created

我一直在用 java+maven+spring+hibernate 开发一个项目,我想在调用 saveorupdate 之前自动将当前日期分配给 POJO。我不介意new Date()为所有类的所有 date_created 创建,但它们已经足够了。我刚刚发现 spring aop 擅长这些事情。
在谷歌上几分钟后,我找到了一个很好的方法。但到目前为止,我无法看到我如何准确地将新日期分配给 POJO,它们是我的介绍接口的实现类。我真的不知道如何把它说得通。所以根据我的理解,我会这样做:

谁能告诉我我在这里做错了什么?或者这只是他实现我想做的错误的方法。感谢阅读

0 投票
1 回答
2955 浏览

java - Spring AOP 和事务添加自定义拦截器

我关于事务的弹簧定义定义如下:

现在,我想添加一些我的应用程序包含的额外拦截器,它们将在每次调用该事务拦截器之前运行。即,我想将其他建议添加到切入点“defaultServiceOperation”,或者添加到“defaultTxAdvice”预拦截器。就像是:

有可能吗?我该怎么做?

0 投票
2 回答
4269 浏览

spring - aop.xml 名称和位置?

有没有办法用 LTW 指定 aop.xml 文件的名称?或定义另一个名称和位置?我有几个我使用的软件模块,它们都使用具有不同设置的 META-INF/aop.xml。我将这些模块包含在一个 Web 应用程序中,然后这一切都取决于它是如何部署/解包的,使用哪个 aop.xml 文件。所以经过长时间的搜索,我发现并非所有的 LTW 编织都会发生纠正,因为它取决于 aop。使用了xml...

基本上我需要使用两个 aop.xml 文件,有点合并 aop.xml 文件的两个内容......

这个怎么做?埃德

0 投票
1 回答
309 浏览

spring - Spring AOP 遗漏了一些东西

我只是在用 Spring (2.5) 玩 AspectJ (1.6),但它似乎没有以正确的方式工作。我使用以下方法设置了我的“beans.xml”:

设置了正确的命名空间和其他一些不重要的 bean。我使用一个简单的 bean 来测试建议:

这是 aop bean:

最后这是测试代码(在 main 方法中):

输出仅打印:

奇怪的是,如果我使用切入点:

日志显示了 AfterReturningExample 类的 System.out.println。我错过了什么?