[英]MyBatis MapperScannerConfigurer to scan base package from classpath
[英]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.