【问题标题】:Adding @Aspect throws BeanCreationException添加@Aspect 会抛出 BeanCreationException
【发布时间】:2020-11-05 02:25:17
【问题描述】:

我正在尝试在 Spring 中使用 AOP。当我在 XML 中使用旧的 DTD 方法时,一切正常。但是当我尝试使用AspectJ 符号时,我遇到了一些问题。我从here 下载了aspectj 的JAR 文件。我将它们添加到构建路径中,并且成功编译了包含@Aspect 注释的代码。但是在运行时,什么都没有被执行。即使是对方面使用基于 XML 的配置的 bean,也没有被创建。它正在抛出一些BeanCreationException。完整的错误日志如下:

WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'emp1' defined in class path resource [Beans.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'emp1' defined in class path resource [Beans.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:512)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85)
    at com.demo.Tester.main(Tester.java:11)
Caused by: java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
    at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getPointcut(ReflectiveAspectJAdvisorFactory.java:210)
    at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvisor(ReflectiveAspectJAdvisorFactory.java:192)
    at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvisors(ReflectiveAspectJAdvisorFactory.java:126)
    at org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors(BeanFactoryAspectJAdvisorsBuilder.java:110)
    at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:95)
    at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:101)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:251)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1141)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1114)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:506) ... 10 more
Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)

有人可以帮我找出错误所在吗?我了解JVM无法以某种方式找到@Aspect注解,但是为什么即使添加了JAR文件也会发生这种情况?

【问题讨论】:

    标签: java spring aop aspectj spring-aop


    【解决方案1】:

    你有一个奇怪的网站来下载 JAR。我建议不要手动下载依赖项 JAR,而是使用像 Maven 这样的构建工具来为您处理。无论如何,如果你想让你作为开发人员的生活更加艰难,你可以手动完成。您可以在此处搜索和下载依赖项:

    https://mvnrepository.com/artifact/org.aspectj/aspectjweaver

    只需搜索,选择您需要的版本,然后下载。

    您的问题的原因是,通过您的链接 URL 猜测,您下载了 AspectJ 运行时库 aspectjrt.jar,但这是最小的一个,并且打算与 ApsectJ 编译时编织一起使用。您正在使用 Spring AOP,它依赖于 AspectJ 加载时编织库 aspectjweaver.jar。把那个放在你的类路径上,然后你的错误应该消失。顺便说一句,weaver 库包含运行时类的超集,因此在这种情况下您不再需要运行时。

    我还建议阅读更多文档。 Spring 手册告诉你使用编织器,而不是运行时,参见章节Enabling @AspectJ Support

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      相关资源
      最近更新 更多