【发布时间】:2017-01-04 10:25:15
【问题描述】:
我有一个应用程序,它具有一个非常简单的插件架构,通过使用 spring 类路径扫描注册附加行为(“安装”插件通过将 plugin.jar 放在类路径上发生)。
这对于注册额外的 bean 非常有用,并且对于注册这样的钩子也非常有用:
// core.jar:
@Component
class CoreClass {
public void addListener(Listener listener) { /* ... */ }
}
// plugin.jar
@Component
class Plugin {
public Plugin(CoreClass coreClass) {
coreClass.addListener(new PluginListener());
}
}
但有时替换整个 bean 更合适。这可能看起来像这样:
// core.jar:
@Component("someBean")
class CoreClass implements CoreInterface {
@Override
public void doStuff();
}
// plugin.jar
@Component("someBean")
@Order(HIGHEST_PRECEDENCE)
class Plugin implements CoreInterface {
@Override
public void doStuff();
}
在这种情况下,我希望在启动期间通过类路径扫描发现 Plugin 和 CoreClass,但是应该忽略 CoreClass,因为 bean someBean 有另一个具有更高优先级的定义。
我知道我可以使用 XML (<import resource="classpath*:plugin-spring.xml" />) 来做到这一点,因为 XML 允许覆盖定义。但这也可以使用注解吗?
编辑:请注意,有时我会基于名称注入多个相同类型(具有不同属性)的 bean 实例。因此,我实际上需要用某个名称覆盖 bean。
【问题讨论】: