1

こんにちは、Spring MVC は初めてなので、アドバイスや説明が必要です。現在、私は MVC アプリケーションを実装しており、コントローラーのスコープに苦労しています。<context:component-scan base-package="controller"/> 私は非常に快適な方法であるすべてのコントローラークラスをスキャンします 。

コントローラー (デフォルトまたは上記の方法でスキャン) は、通常の Bean と同じようにシングルトンであるというのは正しいですか? もしそうなら、私のコントローラーのすべてのメンバー変数はいくつかのリクエスト間で共有されていますか? これを変更できますか?リクエストスコープのコントローラーが欲しいです。と同じように:

<bean id="infoController" class="controller.InfoController" scope="request">
    <constructor-arg ref="sessionFactory"/>
</bean>

コントローラーを Bean として宣言することに副作用はありますか? それとも、このように宣言することは絶対にありませんか?または、それらをリクエストスコープとして宣言しますか? 2 つの方法を組み合わせることはできますか? 何かのようなもの:

<context:component-scan base-package="controller" scope="request"/>

コントローラーをどのように実装し、それらを「リクエスト保存」にしますか?

4

1 に答える 1

3

適切な要約については、次を参照してください。

Spring MVC クラスはスレッドセーフでなければならない

Spring-Controller とそのインスタンス変数のスコープ

コントローラーにメンバー変数を含めることを検討する理由が見つかりませんでした。

コントローラーは通常、リクエスト処理の薄いラッパーである必要があることに注意してください。次に、ロジックをサービスに委任する必要があります。サービスは、リポジトリ/DAO を呼び出す可能性があります。次に、セッション ファクトリをコントローラーに直接渡すことを避け、サービス レイヤーでトランザクションを定義する必要があります。

@Controller
public class MyController{

    @Autowired 
    private MyService service;

    public String handlePost(){
        service.saveEntity(...);
        return "success";
    }
}

@Service
public class MyService{

    @Autowired
    private MyRepository repository;

    @Transactional
    public void saveEntity(Entity e){
    repository.save(e);
    }

}

@Repository
public class MyRepository{

    public void save(Entity e){
    .....
    }

}

例については、こちらを参照してください (JPA/Hibernate に関する定型コードの多くを削減する Spring Data も使用しています)。

http://fruzenshtein.com/spring-jpa-data-hibernate-mysql/

于 2013-10-23T20:02:36.867 に答える