15

1 つのコントローラーを使用して 2 番目のコントローラーのメソッドを呼び出す既存のコードに取り組んでいます。これまでに見た実装は 2 つあります。

最初の実装

return new Controller().method(request, response);

2回目の実装

@Autowired
private Controller controller.

return this.controller.method(request, response);

どちらが正しい実装であり、それらのいずれかに問題がある場合はどうなりますか。

4

6 に答える 6

17

別のコントローラーからメソッドを呼び出す必要があるという単なる事実は、考えられる設計上の欠陥を明らかにします。

オプション1を使用すると、Spring DIコンテナーがもたらしたすべてのものが失われます。つまり、他のコントローラーが、他の依存関係が接続された状態でSpringによってインスタンス化される可能性があります。自分でインスタンス化すると、現時点では機能していても、@ Autowired / @Valueの依存関係がない可能性があるため、他のリソースへの依存関係を追加すると機能しなくなります。その上、あなたはすでにあなたのために構築されたコンテナのインスタンスを持っています、なぜ他のものを作成するのですか?

于 2012-10-11T21:46:46.520 に答える
17

コントローラー間で呼び出しを行う場合、欠陥があるか、リダイレクトを行う必要がありますが、これは完全に有効です。リダイレクトの場合は、次のようにコントローラー メソッドを返すだけです。

return "redirect:/yourDestinationControllerPath";
于 2013-05-29T16:51:57.810 に答える
10

コードをリファクタリングする必要があるようです。2 つのコントローラーに共通するものを別のクラスに抽出し、それをいずれかのコントローラーから呼び出します。

于 2012-10-11T21:38:16.517 に答える
4

あなたは完全に間違っています。Costi Ciudatu's何が間違っているかについては、回答を参照してください。

解決策:service layer and dao layer classesに関連付けることをお勧めしますcontrollers。あなたが持っていると仮定するとAccountControllerAccountServiceクラス(インターフェース+実装)とAccountDao(インターフェース+実装)があります。

ここで、ユーザーがログイン ( LoginController) し、アカウントが必要なため に自動配線AccountServiceする場合、メソッドLoginControllerからユーザーのアカウントの詳細を取得しますAccountService

于 2012-10-12T06:32:37.013 に答える
1

最初のものはより多くの作業が必要です、最初にあなたは本当に毎回Controllerクラスの新しいインスタンスを作成したいですか?

2つ目は、依存性注入または制御の反転と呼ばれるパターンを使用します。SpringがBeanのスコープを管理するようにします。デフォルトでは、Controllerクラスのインスタンスは1つしか作成されませんが、ある時点で(何らかの理由で)この動作を簡単に作成して多くのインスタンスを作成したくない場合は...

于 2012-10-11T21:00:32.973 に答える
0

毎回インスタンスを作成するわけではないので、2 番目は正しいです。@Autowired アノテーションは、必要に応じてオブジェクトをコードに挿入します。

これを確認して ください http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html

しかし、 @Controller アノテーションがあり、コントローラーにはそれを使用し、自動配線する Bean には @Service を使用する必要があります。

于 2012-10-11T20:58:29.473 に答える