3

私の ActionResponse コードは次のとおりです。

@Component
@Scope(value = "request",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ActionResponse{
   public int a;
//body
}

私のコントローラー:

@Controller
@RequestMapping(value="/ajax/discussion")
public class DiscussionController extends AbstractController {

    @Autowired
    private ActionResponse actionResponse;

    public void setActionResponse(ActionResponse actionResponse) {
        this.actionResponse = actionResponse;
    }

    @RequestMapping("/test")
    public @ResponseBody String test(){
        String response=this.actionResponse.a+"";
        if(this.actionResponse.a==0)
            this.actionResponse.a=10;
        return response;
    }

}

プロジェクトを開始し、初めて /ajax/discussion/test をリクエストすると、0 と表示されます

その後、他のリクエストでは10が表示されます

ActionResponse のリクエスト スコープのため、すべてのリクエストで 0 を表示する必要があります。

問題は、bean(ActionResponse) がすべてのリクエストではなく 1 回作成されるのはなぜですか?!!!

4

2 に答える 2

3

CGLIB はクラス レベルで機能します。

CGLIB プロキシはまだシングルトンであるため、基本クラスからフィールドを継承します。そのパブリック プロパティを変更すると、シングルトンの値が変更されます。

パブリックのゲッターとセッターでデータの変更をカプセル化する必要があります。

于 2012-11-16T15:33:59.817 に答える
2

少し遅れました-Boris Treukhovの回答に追加するだけです(+1してください):

その理由は、Spring で ActionResponse にアノテーションを付けたため@Scope(proxyMode=..)、スコープを内部で適切に処理するこの ActionResponse の CGLIB サブクラスを作成することになるためです。

ActionResponse を DiscussionController に注入すると、注入されるのは CGLIB プロキシであり、setter を介してフィールドを直接設定しているため、プロキシのフィールドを変更するだけで、基になるスコープのプロキシ オブジェクトは変更されません。修正は、フィールドではなくゲッターとセッターを介して状態を変更することです。

于 2012-11-16T15:36:07.537 に答える