Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring基础包中扫描组件的整个类路径?_Java_Spring - Fatal编程技术网

Java 如何在Spring基础包中扫描组件的整个类路径?

Java 如何在Spring基础包中扫描组件的整个类路径?,java,spring,Java,Spring,我正在尝试创建一个可插入的系统——在pom中添加一个依赖项,您将在插件列表中获得一个插件 我为plgins提供了一个公共接口 public interface Plugin { public doSmt(); } 然后我重写BeanPostProcessor,在这里我查找实现插件接口的bean,并将它们注册到插件列表单例中以供进一步使用 @Override public Object postProcessBeforeInitialization(Object o, String s)

我正在尝试创建一个可插入的系统——在pom中添加一个依赖项,您将在插件列表中获得一个插件

我为plgins提供了一个公共接口

public interface Plugin {
    public doSmt();
}
然后我重写BeanPostProcessor,在这里我查找实现插件接口的bean,并将它们注册到插件列表单例中以供进一步使用

@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
    return o;
}

@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
    if (o instanceof Plugin){
        pluginContainer.getPlugins().put(s, (Plugin) o);
    }
    return o;
}
如果所有插件都在同一个基本包中,例如ru.mycompany.plugins,那么我可以按如下方式配置spring上下文,它将正常工作:

<context:component-scan base-package="ru.mycompany.plugins">
    <context:include-filter type="assignable" expression="ru.mycompany.plugins.Plugin"/>
</context:component-scan>

但问题是,将来可能会出现外部插件。他们将有另一个包裹。例如com.notmycompany.foo.bar。 所以我需要从根目录(classpath*:**)扫描整个类路径以查找插件

我该怎么做?基本包属性是必需的,将其设置为“*”或“*”将不起作用

也许我应该重写ConnectorsContainerPostProcessor以更改组件查找实现?我尝试过这样做,但在应用程序加载上下文时,只调用构造函数和setResourceLoader方法


如何使用任何包扫描整个类路径,以便能够在BeanPostProcessor中处理bean?

不确定是否可以为所有包指定,甚至不确定这样做是否明智。这将起作用,但您需要单独定义每个包

<context:component-scan base-package="ru.mycompany, com">
    <context:include-filter type="assignable" expression="ru.mycompany.plugins.Plugin"/>
</context:component-scan>


它将递归扫描ru.mycompany.*和com.*包中的所有类。

扫描整个类路径并不是最明智的做法,因为这将花费很长时间,并且应用程序将永远无法启动。您可能希望查看项目或使用简单的实现,而不是扫描整个类路径。这与JRE加载JDBC驱动程序所使用的机制相同,与hibernate检测enver(以及其他)所使用的机制相同。我尝试添加所有已知的基本包,启动应用程序花费了毫秒。我稍微挖掘了一下,发现如果我尝试使用通配符表达式(如“**”)获取资源,使用的WebApp类加载器不会返回所有加载的包。但如果我只是将“ru/”或“com/”传递给getResources(String),它将返回jars源代码。我想我会尝试重写类加载器并使用我自己的类加载器。这就是为什么我试图找到一种重写查找实现的方法。