4

我无法让 AspectJ 在我的主项目中对带有 @configurable 注释的类执行加载时间编织。没有设置任何字段,也没有触及任何设置器。

我不认为配置本身有问题,因为我已经提取了配置并在一个较小的沙箱项目上对其进行了测试。只是为了它,我会将它包含在这个问题中。

所以,我想知道:

  1. 在更大的项目中是否有任何东西可能会阻碍 Spring/AspectJ 检测到这个特定的类?
  2. 有什么方法可以检查 spring 是否知道问题中的类?

最后,我可以提取的任何代码(请原谅混淆):

从配置 XML:

<context:annotation-config />
<context:spring-configured />
<context:component-scan base-package="se.isydev" />
<context:component-scan base-package="se.istools" />
<aop:aspectj-autoproxy />
<context:load-time-weaver aspectj-weaving="on" />
<context:property-placeholder location="classpath:settings.properties" />
(...)
<bean class="com.company.ClassToBeWeaved"
    scope="prototype">      
    <property name="injectedBean" ref="injectedBean" />
</bean>

和班级本身:

@Configurable
public class ClassToBeWeaved {
    private InjectedBean injectedBean;

    @Required
    public void setInjectedBean() { ... }
}

编辑:

好吧,事实证明它由于循环依赖而无法正常工作。哦,天哪,我喜欢处理遗留代码。尽管如此,我最初的问题仍然存在。

4

4 回答 4

0

你有超过 1 个 spring XML 文件吗?我相信我有一个问题 <aop:aspectj-autoproxy /> 不在我的 XML 文件的“最父级”中。

于 2009-12-29T18:33:03.823 回答
0

你可能忘记了“编织”。添加-javaagent:path/to/aspectjweaver.jar-javaagent:path/to/spring-agent.jar到您的命令行。

我还建议@Autowire您使用依赖项而不是显式注入它。

于 2009-09-07T15:05:11.603 回答
0

我相信 LTW 在你的类路径上需要一个 META-INF/aop.xml。它应该看起来像:

<aspectj>
    <!--
        Uncomment this is you need AOP logging <weaver options="-verbose
        -showWeaveInfo
        -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler">
    -->
    <weaver>
        <include within="com.xxx.MyClass" />
    </weaver>
    <aspects>
        <aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
        <include within="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
    </aspects>
</aspectj>
于 2009-09-08T14:35:38.127 回答
0

你的问题的一些提示。

要使加载时间编织与 Spring 一起工作,您不仅需要正确配置aop.xml,还需要拥有spring-instrument.jarspring-aspects.jar

这些 jar 文件包含它们自己的aop.xml,它们声明要处理的 Spring 方面:

  • @事务支持
  • @可配置支持
  • JPA 异常翻译支持
  • 用于调度支持的@Async注解

在后台发生了什么?

当使用 AspectJ 加载时编织时, @ Transactional@Configurable实现不再基于JDK 代理CGLIB 代理,而是基于真正的 AspectJ方面

要启用这些实际方面,您需要额外的 jar 文件。jar 还包含在它们自己的 aop.xml 中的这些方面的声明

有关如何在此处集成 Spring 与 AspectJ 的更多详细信息

于 2012-02-08T14:40:44.900 回答