私はバックエンドサービスのデフォルトimplで実行しているWebアプリケーションを持っています。 1つは、インターフェイスを実装し、プラグインフォルダ(アプリケーションのクラスパスにはない)にjarファイルをドロップできるはずです。サーバーが再起動したら、新しいjarをクラスローダーにロードし、依存関係注入に参加させることが考えられます。 @Autowiredを使ってSpring DIを使用しています。新しいプラグインサービスimplには@Primaryアノテーションが付きます。インターフェイスの2つの意味が与えられているので、プライマリをロードする必要があります。春の依存性注入とプラグインの瓶
jarをクラスローダーにロードして、手動でimplを呼び出すことができます。しかし、私はDependency Injectionに参加することができず、デフォルトのimplを置き換えることができませんでした。ここで
は簡単な例です:より良い場所がないために
@Controller
public class MyController {
@Autowired
Service service;
}
//default.jar
@Service
DefaultService implements Service {
public void print() {
System.out.println("printing DefaultService.print()");
}
}
//plugin.jar not in classpath yet
@Service
@Primary
MyNewService implements Service {
public void print() {
System.out.println("printing MyNewService.print()");
}
}
//、私は、私はクラスローダにjarファイルをロードした後でもContextListener
public class PluginContextLoaderListener extends org.springframework.web.context.ContextLoaderListener {
@Override
protected void customizeContext(ServletContext servletContext,
ConfigurableWebApplicationContext wac) {
System.out.println("Init Plugin");
PluginManager pluginManager = PluginManagerFactory.createPluginManager("plugins");
pluginManager.init();
//Prints the MyNewService.print() method
Service service = (Service) pluginManager.getService("service");
service.print();
}
}
<listener>
<listener-class>com.plugin.PluginContextLoaderListener</listener-class>
</listener>
からプラグインのjarファイルをロードDefaultServiceはまだサービスとしてインジェクトされています。どのようにプラグインジャーを春のDIライフサイクルに参加させるのか?
編集: 簡単に言えば、戦争中のプラグインディレクトリにいくつかのプラグインジャーを持つ戦争ファイルがあります。アプリケーションが見ている設定ファイルの値に基づいて、アプリケーションが起動されると、その特定のプラグインjarをロードし、そのアプリケーションを実行したいと思う。そうすれば、私は戦争を誰にでも配布することができ、すべてのパッケージを再パッケージする必要なしに、設定値に基づいて実行するプラグインを選択することができます。これは私が解決しようとしている問題です。
ありがとうございます。それがうまくいくように見えます。しかし、私は春の注釈を頻繁に使用していますし、プラグインの瓶には春のXMLもありません。私は、Annotation-driven dependency injectionについて上記と同じようにするのがどれほど簡単だろうと思います。 – Langali
各プラグインには何らかの設定が必要です(@拡張回答をご覧ください)。プラグインのパッケージの ' 'を1つしか持たない小さなxmlであっても、プラグイン**やそれ以外はどこにもありません。それは、自分自身を最もよく知っているプラグインであり、それ自体を設定する方法を知っています。コアモジュールは、プラグインの存在を認識すべきではありません。それは、自分自身の設定を 'ApplicationContext'に加える可能性を提供するだけです。 –
Roadrunner