0

私は、SingletonとしてマークされているSpringのController RequestControllerを持っているとします。このコントローラーの内部には、依存性注入を使用して注入されるビルダーがあります。このクラスの主な目的は、リクエストを受信して​​レスポンスを作成することです。シングルトン・メソッド・コントローラー内のビルダーの落とし穴?

@Singleton 
class RequestController { 
    private ResponseBuilder responseBuilder; 

    private RequestController(ResponseBuilder responseBuilder){ 
     this.responseBuilder=responseBuilder; 
    } 

    public Response getResponse(Request request) { 
     return responseBuilder.getRequest(request).build(); 
    } 
} 

私の質問:

このコードの非表示を行い落とし穴はどのような?私たちが通常の春のアプリケーションでそれを使用しようとすると、何がうまくいかない可能性があります。 @Singletonは、このクラスがアプリケーションごとに1回だけ作成されるという情報です。 私は、複数の要求を処理する責任があるので、スレッドセーフでなければならないことを知っています。しかし、ここで他の何か危険ですか?

+0

私は答えを出しました。私の概念についてのWDYT? – Michal

答えて

0

あなたの質問に入る前に、言及すべきことが1つあります。クラスRequestControllerシングルトン@Singletonと宣言しました。あなたのクラスがシングルトンの場合は、それが不変であることを確認する必要があります。したがって、作成後に状態が変化しません。だから、私はそれがステートレスなクラスであると仮定します。だからあなたはプライベートなコンストラクタを持つ必要はありません。それはむしろ面倒です。代わりに使用することができ、

@Inject 
private RequestController(ResponseBuilder responseBuilder){ 
     this.responseBuilder=responseBuilder; 
} 

は、あなたが良いデザインを維持する場合は、ResponseBuilderクラスが注入可能なものでなければならない、ということに注意してください。 RequestControllerクラスは、注入だけで呼び出す必要があります。

問題に戻ると、ほとんど問題はないと思います。 what patterns we could drag and drop into our code?

コントローラーを作ると、シングルトンはかなり上手くいきます。what our real problem is?については非常に注意が必要です。しかし、ResponseBuilderBuilderパターンを使用する必要はありません(名前も変更できます)。あなたのクラスがかなりシンプルで、操作の数が限られている場合(良いデザインの兆候)、生涯にわたって建築者のパターンは必要ありません。それは私たちが斧で紙を裂くようにもっとよく似ています。なぜ素手を使わないのですか?

Builderは、何らかの理由でかなり大きなスコープクラスを作成する必要がある場合にのみ使用してください。 HamcrestにBuilderパターンを使用する良い例があります。 Googleが開発したJavaテストのツールassertionです。彼らは、単一のオブジェクトの中から複数のタスクリストを提供することによってそれを使用するプログラマーの人生を楽にするために、いくつかのクラスに対してビルダーパターンを使用してきました。

0

ありがとうございます...私はこのコードで間違っている可能性があるアイデアを持っています...もちろん、私はResponseBuilderで注入を使用する必要があります。しかし、古典的なビルダーパターンにはステートがあります。ステートレスコントローラでは、ResponseBuilderが提供するステートフルクラスを使用しています。したがって、スレッドセーフでないと自動的にビルドされるため、並行性の問題(競合状態)が発生する可能性があります。複数のスレッドがBuilderフィールドにアクセスしようとするたびに、異なるステートになることがあります(Builderはスレッドセーフではないため)。ですから、ビルダースレッドを安全にしようとすると、うまくいくでしょうが、新しい問題が発生します。私たちのビルダーはスレッドセーフであるため、1つのスレッドだけがそれを使用することができ、これによりリクエストのためのブートローキックが発生する可能性があります(複数のリクエスト/スレッドはこのメソッドを使用しますが、スレッドセーフであるビルダーによってブロックされます)。私の考えがよければ叫んでください:)

+0

私はあなたのポイントを得ることはありません、 'ビルダーはスレッドセーフではありません'。あなたは私に現実世界のシナリオを与えることができますか? :)) –

関連する問題