2017-11-21 6 views
0

最近、Webプロジェクトで作業しています。Springベースの開発に関するベストプラクティスとSpring Beanスコープに関するいくつかのことを明確にしたいだけです。ここで私は、私はその後、私はSpringのステートレスサービスレイヤー

私はJobServiceを作りたい。ここで
@Service 
Public class JobService { 
    public void run(Job job){ 
     -- perform the business logic 
    } 
} 

以下のようにサービスを持っている

@Controller 
Public class JobController{ 
    private JobService jobService; 

    @Autowired 
    public void setJobService(JobService jobService) { 
     this.jobService = jobService ; 
    } 

    public void run(){ 
     Job job = new Job(); 
     -- Setting the properties for the Object 

     jobService.run(job); 
    } 

} 

以下などのWebコントローラを持っているサンプルコード

を使用してシナリオを使用しています私はJobServiceをシングルトンとして定義できるので、不要なオブジェクトの作成を減らすことができます。クラスの状態を無制限にするために、私はインスタンスのプロパティを保持したくありません。このシナリオでは、さまざまなJobオブジェクトをサービスに渡します。これは、JObserviceが異なるジョブオブジェクトを処理するため、このJobServiceをステートフルにしますか?あなたは

おかげで、 Keth

+0

デフォルトでは、SpringではすべてのSpring Beanが特に指定されていない限り、シングルトンです。したがって、デフォルトでJobService上に@Serviceがある場合、それは返信のためのシンプルな – pvpkiran

+0

@pvpkiranです。はい、デフォルトではSpring Beanはシングルトンです。しかし、サービスクラス内のロジックをシングルトンにする必要がありますか?シングルトンとしてマークした場合でも、開発者がシングルトンの動作に違反する可能性があります。 – keth

答えて

1

が異なるオブジェクトを渡すと、あなたのサービスがステートフルことはありません理解するために私を助けてくださいすることができます。

たとえば、これを考えてみましょう。

@Service 
Public class JobService { 
    private Job currentJob; 
    public void setJob(Job job) { 
    currentJob = job; 
    } 
    public void run(){ 
     -- perform the business logic on currentJob 
    } 
} 

これは、Beanを「ステートフル」にし、原因不明の動作を引き起こします。

複数のコントローラ/スレッドによるシングルトンでのメソッドの実行は衝突しないので、安全であると見なすことができます。

+0

返信のために@zatopekに感謝します.Singleton Beanの場合、これらのサービスレイヤメソッドをSpringで明示的に同期させる必要はありませんか? – keth

+1

共有リソースにアクセスしていない場合でも、メソッドスコープを超えてアクセス変数を使用する場合は、状況に応じて評価する必要があります。 – zatopek

関連する問題