最近在用 spring 构建插件架构时,发现如果被载入的spring 配置类包含 @EnableAutoConfiguration 注解,则会导致CNF (class not found) 问题。但奇怪的是,在容器中设置类加载器时,已经包含了插件依赖的包,还是报这个错,甚至,在调试时,直接用容器的类加载器去加载找不到的这个类,居然还找到了。由此确定报错的地方没有使用容器的类加载器。经过排查发现是因为配置类中加了@EnableAutoConfiguration这个注解。

官方解释,这个注解会根据当前类路径中包含的类来推断是否应该配置某些bean,问题就来了,这个猜测机制肯定会用到类加载器,否则如何载入bean?但没有看到任何地方提供方法来替换该类加载器,因此推测此加载器是封装在 spring 内部的。

因为用到 @EnableAutoConfiguration 注解的地方是为了提供插件调试用的简易容器实现,所以直接 @Profile(“ignored”) 来避免该配置类被载入。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐