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

时间:2014-09-18 17:46:07

标签: java spring

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

我为plgins提供了一个通用接口。

public interface Plugin {
    public doSmt();
}

然后我重写BeanPostProcessor,在那里我寻找实现插件接口的bean并在Plugins List Singleton中注册它们以供进一步使用。

@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 *:**)扫描整个类路径以查找插件。

我该怎么做? Base-package属性是必需的,将其设置为“*”或“**”将不起作用。

也许我应该重写ConnectorsContainerPostProcessor来改变组件查找实现?我尝试这样做,但只有在应用程序加载上下文时才调用constructor和setResourceLoader方法。

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

1 个答案:

答案 0 :(得分:0)

不确定您是否可以指定所有包,甚至是否是明智的方法。这将有效,但您需要单独定义每个包。

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

它将递归扫描ru.mycompany。*和com。* package。

中的所有类