アプリケーションが開始されるとすぐに、クラス (クラスのインスタンスではない) をファクトリに登録するアノテーションを実装したいと考えています。Spring Framework 4.2.7 を使用しています。
ダッシュボードと複数のウィジェットを備えたシステムを考えてみましょう。ダッシュボードには、現在のユーザーに表示するウィジェットのリストを含む構成ファイルがあります。表示されると、構成が読み取られ、ウィジェットが作成されます。ウィジェットは、構成から追加のパラメーターを受け取ります。
これを説明するコードを次に示します。
public class TestDashboard implements Dashboard {
public void dashboardPreDisplay() {
List<String> widgets = getWidgetList(/* current user in session */);
for (String widgetId : widgets) {
// create instance of DashboardWidget with given ID
DashboardWidget x = widgetFactory.createWidget(widgetId);
}
}
public List<String> getWidgetList(String user) {
// load list of IDs of DashboardWidgets to be displayed for the user
}
@Autowired
private WidgetFactory widgetFactory;
}
@Service
public class WidgetFactory {
public DashboardWidget createWidget(String widgetId) {
// look up Class<> of DashboardWidget with given id in widgetClasses
// construct and initialize DashboardWidget
}
private HashMap<String, Class<?>> widgetClasses;
}
ウィジェットを実装するとき、ウィジェットをファクトリ クラスに登録することはしたくありません。理想的には、次のようにウィジェットに注釈を付けます。
@DashboardWidget(id = "uniqueId")
public class DashboardWidgetA implements DashboardWidget {
// ...
}
アプリケーションが起動すると、クラスパスで@DashboardWidget
アノテーションをスキャンし、ファクトリにクラスを登録して、createWidget-method にウィジェットの ID を指定してウィジェットを構築できるようにする必要があります。
現時点では、私は少し混乱しています。Spring には、この動作を実現するためのすべてのツールが搭載されていると思います。しかし、私はそれを行う方法を考えることができません。
何かアドバイスはありますか?