Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constr

本文记录了在学习 Spring In Action AOP 过程中遇到的问题及解决方法,包括缺少 aspectjweaver-1.9.4.jar 导致的 NoClassDefFoundError 错误,以及 spring aop 代理混用导致的 BeanNotOfRequiredTypeException 错误。

在学习spring in action AOP第四版书籍的时候报错:

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'knight' defined in class path resource [resources/minstrel.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Cannot create inner bean '(inner bean)#1784306' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1784306': Cannot resolve reference to bean 'embark' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embark': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constructor found; 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 'knight' defined in class path resource [resources/minstrel.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Cannot create inner bean '(inner bean)#1784306' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1784306': Cannot resolve reference to bean 'embark' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embark': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constructor found; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:479)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
	at main.java.sia.knights.KnightMain.main(KnightMain.java:9)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Cannot create inner bean '(inner bean)#1784306' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1784306': Cannot resolve reference to bean 'embark' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embark': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constructor found; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:313)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:648)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:145)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1201)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1103)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92)
	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:102)
	at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:103)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:248)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1045)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1019)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:473)
	... 10 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1784306': Cannot resolve reference to bean 'embark' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embark': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constructor found; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:634)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:145)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1201)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1103)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:299)
	... 28 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embark': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constructor found; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1163)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1107)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
	... 36 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constructor found; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:85)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1155)
	... 42 more
Caused by: java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
	at java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
	at java.lang.Class.getConstructor0(Class.java:3075)
	at java.lang.Class.getDeclaredConstructor(Class.java:2178)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80)
	... 43 more
Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 48 more

在网上找了下原因,发现是没用导入jar包(很奇怪,我已经是按照spring的工程用idea创建的,为什么还缺包),然后找到是缺少 aspectjweaver-1.9.4.jar这个jar包,在下面的网站下载jar包:
https://mvnrepository.com/
在这里插入图片描述下载好之后,重新导入jar包,并编译:发现还有错误

七月 19, 2019 11:07:17 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6a30c7: startup date [Fri Jul 19 23:07:17 CST 2019]; root of context hierarchy
七月 19, 2019 11:07:17 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [resources/minstrel.xml]
Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'knight' is expected to be of type 'main.java.sia.knights.BraveKnight' but was actually of type 'com.sun.proxy.$Proxy2'
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:384)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1086)
	at main.java.sia.knights.KnightMain.main(KnightMain.java:12)

继续找原因:是spring aop代理混用,在xml配置里面加上配置:
<aop:aspectj-autoproxy proxy-target-class=“true”/>
错误解决。
原文链接:代理混用解决方法

<think>好的,我现在需要帮助用户解决Spring框架中出现的Bean创建失败问题,特别是涉及AspectJ相关的异常,比如BeanCreationException、AspectJPointcutAdvisor、NoClassDefFoundError和ReflectionWorldException。首先,我得回忆一下用户提供的引用内容,看看有没有相关的线索。 用户提供的引用中,引用[1]提到了JedisConnectionFactory的实例化失败,原因是缺少redis/clients/util/Pool类,这可能是因为依赖未正确引入。引用[2]是关于缺少HttpServlet类,解决办法是引入对应的jar包。引用[3]展示了如何通过排除自动配置类来解决问题,引用[4]则是一个依赖引入的例子。这些引用都涉及到类路径缺失或依赖配置的问题,这可能与用户当前的问题有关联,因为用户的问题同样涉及NoClassDefFoundError。 用户的问题具体是Bean创建失败,涉及AspectJ的类找不到。首先,我应该考虑AspectJ相关的依赖是否正确引入。Spring AOP通常需要aspectjweaver和aspectjrt这两个库。如果项目中使用了AspectJ注解或切面,但没有正确添加依赖,就会导致NoClassDefFoundError,尤其是ReflectionWorldException,这通常是AspectJ内部类找不到,可能因为版本不兼容或缺少aspectjweaver。 接下来,我需要检查依赖配置。比如,Maven项目中是否包含了aspectjweaver的依赖。例如,用户引用[4]中的spring-jdbc依赖格式,可以类比添加aspectjweaver的依赖。正确的依赖应该是: ```xml <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency> ``` 另外,版本兼容性也很重要。如果Spring版本较高,而AspectJ版本过低,可能会引发问题。需要确保两者版本兼容。 然后,检查切面配置是否正确。用户可能使用了@Aspect注解,但未启用AspectJ自动代理。在Spring配置中,需要添加@EnableAspectJAutoProxy,或者在XML配置中添加<aop:aspectj-autoproxy/>。如果配置遗漏,可能导致切面无法被识别,进而引发Bean创建异常。 另外,类路径扫描的问题也需要考虑。确保包含切面的包已经被组件扫描覆盖,比如使用@ComponentScan注解或在XML中配置了正确的包路径。如果切面类未被扫描到,Spring无法创建对应的Bean,导致BeanCreationException。 此外,项目类型是否为AspectJ项目。如果使用的是编译时织入(CTW)或加载时织入(LTW),可能需要额外的配置,比如在Maven插件中配置aspectj-maven-plugin,或者添加Spring的LoadTimeWeaver。如果配置不当,同样会引起类找不到的问题。 用户提到的ReflectionWorldException,查阅文档可知,这通常是因为AspectJ的ReflectionWorld无法找到某个类,可能是目标类或切面类本身不在类路径中,或者版本冲突导致某些类无法加载。这时候需要检查相关类的存在性,以及依赖的版本是否一致。 总结可能的解决步骤: 1. 添加或更新AspectJ依赖,特别是aspectjweaver。 2. 检查并确保启用AspectJ自动代理。 3. 确认组件扫描包含切面类所在的包。 4. 验证依赖版本兼容性,避免Spring和AspectJ版本冲突。 5. 检查项目构建路径,确保所有相关jar包已正确引入,没有重复或冲突。 6. 如果使用LTW,检查相关配置如aop.xml和JVM参数。 可能还需要查看具体的异常堆栈,确定缺失的具体类,从而更精确地定位问题。例如,如果异常中提到某个特定的AspectJ内部类,可能是某个依赖项未正确添加或版本不对。 最后,根据用户提供的引用,之前的解决方案多与依赖缺失有关,因此首要步骤应该是检查AspectJ相关依赖是否正确引入,并排除版本冲突的可能性。</think>针对Spring框架中因AspectJ依赖缺失或配置错误导致的`BeanCreationException`,以下是分步解决方案: ### 1. **添加AspectJ核心依赖** AspectJ相关功能需要`aspectjweaver`和`aspectjrt`库支持。在Maven项目中添加以下依赖(版本需与Spring兼容): ```xml <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.7</version> </dependency> ``` > 注意:Spring 5.x通常兼容AspectJ 1.9.x[^4] ### 2. **启用AspectJ自动代理** 在配置类中增加`@EnableAspectJAutoProxy`注解: ```java @Configuration @EnableAspectJAutoProxy public class AppConfig { } ``` 或在XML中配置: ```xml <aop:aspectj-autoproxy/> ``` ### 3. **检查组件扫描范围** 确保切面类(`@Aspect`标注的类)所在包已被`@ComponentScan`覆盖: ```java @ComponentScan(basePackages = "com.example.aop") public class Application { } ``` ### 4. **验证依赖版本兼容性** 检查Spring与AspectJ版本匹配关系: - Spring 5.x ➔ AspectJ 1.9.x - Spring 4.x ➔ AspectJ 1.8.x 若存在版本冲突,使用Maven的`dependency:tree`命令分析依赖关系。 ### 5. **加载时织入配置(LTW)** 若使用加载时织入,需添加配置: ```xml <context:load-time-weaver aspectj-weaving="on"/> ``` 并在JVM启动参数中添加: ``` -javaagent:/path/to/aspectjweaver.jar ``` ### 6. **检查构建路径配置** 确保IDE中已正确识别所有依赖: - Eclipse:右键项目 ➔ Maven ➔ Update Project - IntelliJ:Reimport All Maven Projects --- ### 典型错误示例分析 若出现`NoClassDefFoundError: org/aspectj/reflect/ReflectionWorldException`,表示: 1. `aspectjweaver.jar`未正确引入 2. 存在多个冲突的AspectJ版本 3. 项目未正确清理(尝试执行`mvn clean install`) ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值