すべてのサービスにシングルトン パターンを使用し、他のサービスを使用するサービス内および Web 層で ServiceName.getInstance() を介してすべてのサービスにアクセスするレガシー アプリケーションがあります。私はSpringを使用するようにプロジェクトを変換しており、メソッドgetServiceA、getServiceB..etcでシングルトンユーティリティクラスServiceProviderを作成し、SpringアプリケーションコンテキストからBeanを取得することを考えていました。Spring を使用するように変換することはまだできないため、Web 層でのみ ServiceProvider を使用し、他のサービスを使用するすべてのサービスを自動配線します。これは良い解決策ですか?
私は非常に単純な Web 層を持っており、最小限の変更でそれをスプリング化する方法を誰かが推奨できるかもしれません。起動時に読み込まれるコントローラーへの URL のマップがあります。RequestDispatcher はリクエスト URL を解析し、クラスごとにコントローラーを検索して、テンプレート メソッドを実行します (基本コントローラーにはさまざまなサブクラスがありますが、問題は複雑になりません)。
RequestDispatcher:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int slashIndex = req.getRequestURL().lastIndexOf("/");
String path = req.getRequestURL().substring(slashIndex, req.getRequestURL().length());
ServiceURL url = urlMap.get(path);
ServiceProvider.getLog().info("Requested page: " + path);
if (url != null) {
try {
Utils.authenticate(req, resp);
grantAccess(req, url);
BaseServlet servlet = (BaseServlet)url.getClass().getClassLoader().loadClass(url.getClassName()).newInstance();
servlet.service(req, resp);
}
catch (AuthorizationException e) {
resp.getWriter().write(new ErrorModel("You are not authorized to perform the requested action.").getContent());
ServiceProvider.getAuthLog().info("auth", e);
}catch (SystemException e) {
パッケージを自動スキャンして、サーブレットにコンポーネントとして注釈を付けることを考えています。ApplicationContext は完全なクラス名で Bean を取得できますか?