ClassPathScanningCandidateComponentProvider 是否无法扫描到我隔离classloader中的类,我要扫描到我隔离的classloader中的类需要如何处理呢?基于Spring 5.3 来讲一下。
在Spring 5.3中,ClassPathScanningCandidateComponentProvider已经支持扫描指定的类加载器了。具体做法如下:
- 创建一个自定义的类加载器,用于隔离需要扫描的类。
public class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
}
- 使用ClassPathScanningCandidateComponentProvider的setResourceLoader方法设置自定义的类加载器。
MyClassLoader myClassLoader = new MyClassLoader(new URL[]{}, Thread.currentThread().getContextClassLoader());
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false, myClassLoader);
scanner.setResourceLoader(myClassLoader);
- 使用ClassPathScanningCandidateComponentProvider的findCandidateComponents方法进行扫描。
Set<BeanDefinition> beanDefinitions = scanner.findCandidateComponents("com.example");
这样就可以扫描到指定类加载器中的类了。需要注意的是,这种方法可能会导致类加载器泄漏,因此需要谨慎使用。
原文地址: https://www.cveoy.top/t/topic/vEq 著作权归作者所有。请勿转载和采集!