Java spring报错 java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected
首先感谢大佬ncepu_Chen的热情帮助,自己搞了一下午没成,结果大佬来了分分钟解决战斗。
先确定下问题的情况,在程序的正确位置加了注解之后,开始运行。
- 首先第一点发现程序运行特别慢
- 之后程序报错,主要错误内容就是“java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected”
- 大佬今天来了直接给我展示了两个解决办法,之前在网上只找到一种,还说的不明不白,一堆人还准来转去,真服,这个魔幻的世界。
这里是我最开始跟着视频写的注解方式,结果就报错了。。。
报错原因(方便对症下药)
-
出现这种错误的一般都是新手,基本都不懂spring的运行原理。
-
“@ComponentScan”注解在运行时会自动扫描默认路径下的包,当你的文件都在一个包下面时,一般不会出现问题。
-
但是有时候我们main函数所在的类会写在其他包的外面,这时就出现问题了。
-
spring进行扫描时,会以配置类(默认@Component 注解加在配置类中)所在的包为基础,扫描当前包,以及其子包。
-
此时我们运行程序, “@ComponentScan”就去扫描电脑中的包,上面所说的“程序运行特别慢”就是这个原因,因为需要扫描的包实在太多了。然后就可能扫到了spring自带的一些包,然后就报错。。。
-
要解决这个问题,我们要做的其实就是指定 “@ComponentScan”的扫描范围。
-
下面上解决办法
第一种解决办法,修改注解
这个时候大佬又给我科普了一下,注解其实就是一个增强的函数,注解也可以有自己的参数。
//第一种
@ComponentScan("soundsystem")
// 第二种
@ComponentScan(basePackages = "soundsystem")
// 第三种
@ComponentScan(value = "soundsystem")
// 第四种
@ComponentScan(basePackageClasses = {CDPlayer.class, CompactDisc.class})
很明显前三个注解传入的参数都是包名,而第四个传入的参数是类名。
这里我只用到了一个包,所以参数都只有一个,如果你使用到了多个包的话,将包名以字符串数组的形式传入就可以:{“package1”,“package2”…}
如果使用第四种方式的话就把所有的类名以数组的形式传入就可以。
- 注意此时,main函数中的初始化代码应该为
ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
第二种解决办法,写xml配置文件
在resource中新建一个spring配置文件(建过就不用再建了,直接对照代码修改就行),命名没什么要求。不过一般大家都命名为ApplicationContext.xml
新建好配置文件之后,将里面的默认代码替换为一下代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--下面一行代码是必须要加的,而且要注意添加的位置,必须要在下面的xsi 之前 -->
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
<!--下面三行代码实测可有不添加-->
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 下面的 component-scan base-package="*" 将“*”修改为你所用的包
,有多个时再后面再加一条<context:component-scan base-package="*">就可以-->
<context:component-scan base-package="*"></context:component-scan>
</beans>
- 注意此时,main函数中的初始化代码应该为
ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
//Spring.xml 是我xml文件的名字