Eclipse:如何将Web项目转换为AspectJ项目并使用AJDT插件编织和运行它?

时间:2009-06-08 21:34:44

标签: java eclipse spring spring-aop

我想做什么:

  • 我想在Spring中使用@Configured注释。它需要启用AspectJ。我认为使用AJDT插件进行编译时编织可以解决这个问题。在安装插件之前,应该注入我的@Configured对象的依赖项保持为空。

我做了什么:

什么行不通:

  • 当我立即启动Tomcat 6服务器时,我收到异常*。

其他信息:

  • 我没有在项目属性的AspectJ Build和AspectJ Compiler部分中配置任何内容。
  • 在“首选项”下的“JDT编织”表示已启用编织。
  • 我仍然在项目属性下拥有Java构建路径和Java编译器。它们看起来像我之前配置的那样(而上面两个新条目没有配置)。
  • 我的@Configured对象文件的图标看起来像任何其他文件(即没有任何方面或类似的指示,我认为应该有)。文件名是MailNotification.java(而不是.aj),但我想它应该仍然有效,因为我正在使用AspectJ的Spring注释?
  • 我没有找到任何教程或类似的教程:如何将Spring Web应用程序项目转换为AspectJ项目,并使用AJDT插件将方面编织到文件中,所有这些都在Eclipse 3.4中。如果那里有类似的东西,我会非常有兴趣了解它。

我想知道的事情:

  • 从哪里开始?我只想使用Spring的@Configured注释。我也在使用@Transactional,我认为它也需要AspectJ。
  • 如果可能的话,我希望尽可能少地研究AspectJ,只要满足我的需求。这个主题似乎很有趣,但是很大,我想要做的就是使用上面提到的两个Spring注释。

***启动Tomcat 6时出现异常:

Caused by: java.lang.IllegalStateException: ClassLoader [org.apache.catalina.loader.WebappClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-agent.jar
at org.springframework.context.weaving.DefaultContextLoadTimeWeaver.setBeanClassLoader(DefaultContextLoadTimeWeaver.java:82)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1322)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
... 41 more

3 个答案:

答案 0 :(得分:1)

您是否已将spring-aspects.jar添加到项目的方面路径中?

在项目属性中,在“AspectJ Build”下 - > 'Aspect Path'尝试添加spring-aspects.jar并清理构建项目。

很抱歉,你可能已经这样做了 - 但你没有提到它。

答案 1 :(得分:0)

看起来编织时编织不起作用。尝试将以下行添加到applicationcontext.xml

<context:load-time-weaver />
<context:spring-configured/>

您可能还想将以下xsd添加到xml文件中

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

详见此处:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-aj-ltw

答案 2 :(得分:0)

您可以在没有AspectJ的情况下使用@Transactional。您的配置文件应包含以下内容以使其正常工作:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
  http://www.springframework.org/schema/util 
  http://www.springframework.org/schema/util/spring-util-2.5.xsd"
  >
<tx:annotation-driven/>

告诉spring在创建配置bean的实例时查找@transactional注释。在找到这样的注释时,spring将bean的动态代理返回给应用程序代码。此动态代理确保无论何时调用带注释的方法,spring都能够拦截它以提供预期的事务行为。但是基于代理的AOP要求您对接口而不是具体类进行编码。