实现 自定义的包扫描。
public class CustomComponentScan implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {
private ResourceLoader resourceLoader;
private Environment environment;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
// 可以写死或者从 environment 中获取要加载的 jar 路径,可以是本地的可以是网络的
URL[] urls = new URL[]{...};
// 注入 系统classloader,这样才能扫描到,并且类加载器能找到class,不会classnotfound
try {
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
if (!method.isAccessible()) {
method.setAccessible(true);
}
for (URL url : urls) {
method.invoke(resourceLoader.getClassLoader(), url);
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
// 扫描 bean定义
int scan = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry, true, environment, resourceLoader)
.scan("这里是要扫描的包名,比如:com.demo.xxx");
}
}
在启动类中引入
@SpringBootApplication
// 引入
@Import(CustomComponentScan.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}