在Spring 5.3中,ClassPathScanningCandidateComponentProvider已经支持扫描指定的类加载器了。具体做法如下:

  1. 创建一个自定义的类加载器,用于隔离需要扫描的类。
public class MyClassLoader extends URLClassLoader {
    public MyClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
    }
}
  1. 使用ClassPathScanningCandidateComponentProvider的setResourceLoader方法设置自定义的类加载器。
MyClassLoader myClassLoader = new MyClassLoader(new URL[]{}, Thread.currentThread().getContextClassLoader());
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false, myClassLoader);
scanner.setResourceLoader(myClassLoader);
  1. 使用ClassPathScanningCandidateComponentProvider的findCandidateComponents方法进行扫描。
Set<BeanDefinition> beanDefinitions = scanner.findCandidateComponents("com.example");

这样就可以扫描到指定类加载器中的类了。需要注意的是,这种方法可能会导致类加载器泄漏,因此需要谨慎使用。

ClassPathScanningCandidateComponentProvider 是否无法扫描到我隔离classloader中的类,我要扫描到我隔离的classloader中的类需要如何处理呢?基于Spring 5.3 来讲一下。

原文地址: https://www.cveoy.top/t/topic/vEq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录