簡體   English   中英

如何在Spring中忽略基本包來掃描整個類路徑中的組件?

[英]How to scan entire classpath for components in Spring ignoring base package?

我正在嘗試創建一個可插入系統-在pom中添加一個依賴項,您將在plugins列表中獲得一個插件。

我提供了通用的界面。

public interface Plugin {
    public doSmt();
}

然后,我重寫BeanPostProcessor,在其中尋找實現Plugin接口的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 *:**)掃描整個類路徑以查找插件。

我怎樣才能做到這一點? 基本包裝屬性是必填屬性,將其設置為“ *”或“ **”將不起作用。

也許我應該重寫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。*軟件包中的所有類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM