1

アプリケーションが開始されるとすぐに、クラス (クラスのインスタンスではない) をファクトリに登録するアノテーションを実装したいと考えています。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 には、この動作を実現するためのすべてのツールが搭載されていると思います。しかし、私はそれを行う方法を考えることができません。

何かアドバイスはありますか?

4

1 に答える 1