Java 如何在Spring基础包中扫描组件的整个类路径?
我正在尝试创建一个可插入的系统——在pom中添加一个依赖项,您将在插件列表中获得一个插件 我为plgins提供了一个公共接口Java 如何在Spring基础包中扫描组件的整个类路径?,java,spring,Java,Spring,我正在尝试创建一个可插入的系统——在pom中添加一个依赖项,您将在插件列表中获得一个插件 我为plgins提供了一个公共接口 public interface Plugin { public doSmt(); } 然后我重写BeanPostProcessor,在这里我查找实现插件接口的bean,并将它们注册到插件列表单例中以供进一步使用 @Override public Object postProcessBeforeInitialization(Object o, String s)
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源代码。我想我会尝试重写类加载器并使用我自己的类加载器。这就是为什么我试图找到一种重写查找实现的方法。