0

Spring で ApplicationContext 実装を使用しているとします。

ApplicationContext は Java Spring Framework のインターフェースであり、変更できません。

この実装のインスタンスが 1 つだけであることを確認するにはどうすればよいですか?

たとえば。私は次のコードを持っています -

public class ApplicationContextSingleton 
{
     private static ApplicationContext context;
     private static int numberOfInstances = 0;

     public static ApplicationContext getApplicationContext()
     {
         if(numberOfInstances == 0)
         {
             context = new ClassPathXmlApplicationContext("spring.xml");
             numberOfInstances++;
         }
         return context;
     }
}

このようにして、次のように取得した場合、ApplicationContext のインスタンスが 1 つだけであることを確認できます。

ApplicationContext context = ApplicationContextSingleton.getApplicationContext();

しかし、それは別のプログラマーが言うことを止めるものではありません -

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 

これにより、新しい ApplicationContext を作成します。これを防ぐにはどうすればよいですか?

4

5 に答える 5

3

シングルトンを作成ApplicationContextしたいので、独自のカスタム クラスでクラスをオーバーライドし、クラス パスの最初に表示されるようにして、プライベート コンストラクターを作成します。

つまり、シングルトンにすることに夢中になっている場合です。他の回答やコメントで指摘されているように、問題を解決するためのより良い方法があります。

特にフレームワークのバージョンをアップグレードしようとすると、後で頭痛の種になる可能性があるため、ライブラリの一部をオーバーライドすることは通常悪い考えであることに注意してください。

于 2012-06-12T17:30:42.913 に答える
2

誰かがすごくクリエイティブなことを考え出さない限り、これを行う方法はないと思います。intこれは、シングルトンを作ろうとすることに似ています。作成していないクラスの使用を制御できないため、起こりません。開発者が 2 番目のコンテキストを作成しないことを信頼する必要があります。

または、これは問題外になるとほぼ約束できますが、Spring の完全なソースを入手し、コードを変更してコンテキストをシングルトンにしてから、自分で構築することもできます。ありそうな解決策ではありませんが、とにかく指摘する必要があると感じました。

于 2012-06-12T17:32:06.237 に答える
1

それを行う方法はありません

ClassPathXmlApplicationContext は、Spring による Singleton パターンとして実装されていません。コンテキスト オブジェクトにアクセスするためのユーティリティ メソッドがあり、new を使用してコンテキストを作成するのはコストがかかることをすべての人に知らせてください。

于 2012-06-12T17:30:54.893 に答える
1
  1. コードがソフトウェア リポジトリにコミットされるたびにコードをビルドする自動ビルド システムを使用します。
  2. FindBugs や PMD などのツールをビルド プロセスに統合します。これらのツールが特定の条件をトリガーする場合、ビルドに失敗し、アーティファクトが生成されないようにします。
  3. 独自のコンテキストを作成している開発者を探す統合ツールでケースを作成します。

したがって、彼らがそれを行うのを止めることはできませんが、そのようなものを dev、qa、および prod 環境にプッシュするのを止めることはできます。これはやり過ぎのように思えるかもしれませんが、この種のプロセスは、開発者ができるけれどもすべきではない何百ものことを支援します。

于 2012-06-12T17:40:20.930 に答える
0

Josh Block は、Effective Javaで列挙型を使用することを提案しています。これはその本へのリンクではありませんが、彼と古い方法(代替)の方法を示しています

于 2012-06-12T17:30:28.723 に答える