私は非常に単純なプラグインアーキテクチャを持ち、Springクラスパススキャンを使って追加の動作を登録する手段を持っています(plugin.jarをクラスパスに置くことによってプラグインがインストールされます)。クラスパススキャンを使用して定義されたSpring Bean定義を上書きできますか?
これは、追加の豆を登録するための素晴らしい作品、それはまた、このようなフックを登録するための素晴らしい作品:
// core.jar:
@Component
class CoreClass {
public void addListener(Listener listener) { /* ... */ }
}
// plugin.jar
@Component
class Plugin {
public Plugin(CoreClass coreClass) {
coreClass.addListener(new PluginListener());
}
}
は、しかし、時には全体の豆を交換するために、より適切です。これは、次のようになります。
// 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
を無視するようにしたい。この場合、豆someBean
は、優先順位の高い別の定義を持っているので。
私はXML(<import resource="classpath*:plugin-spring.xml" />
)を使用してこれを行うことができることを知っています。なぜなら、XMLはオーバーライド定義を可能にするからです。しかし、アノテーションを使用してこれも可能ですか?
編集:時々、私は名前ベースのものを注入する同じタイプ(異なる特性を持つ)の複数のBeanインスタンスを持っていることに注意してください。したがって、実際には特定の名前でBeanをオーバーライドする必要があります。使用する
真、一次はあなたが上記示しケース(タイプベースの注射)で動作します。しかし、私の場合、私は名前に基づいて注入する特定のタイプの複数のインスタンスを持つことがよくあります。しかし、@Primaryでは、同じ名前の2つのBeanを定義することはできません。 – yankee
私はあなたが春になる予定のものを何かしようとしていると思う。私の提案は '@ Primary'と' @ Qualifier'を使って別のBeanが必要なところです。 –