2012-10-11 64 views
7

1つのコントローラを使用して2番目のコントローラのメソッドを呼び出す既存のコードを作成しています。これまでに私が見た2つの実装があります。Spring MVC、コントローラ内から別のコントローラを呼び出す

第一実施

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

問題が何であるか右の実装であり、第二実施

@Autowired 
private Controller controller. 

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

それらのいずれかであれば。

+0

この利点は何ですか?そうすることで多くの慣習が破られ、コントローラコードを分割したり、ロジックの一部をビジネスレイヤーに移動したりするなど、改訂を検討する必要があります。 – dardo

答えて

9

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

オプション1を使用すると、Spring DIコンテナが持ってきたすべてのものが失われます。つまり、他のコントローラがSpringによってインスタンス化され、その他の依存関係が配線されている可能性があります。 @Autowired/@Valueの依存関係がない可能性があるので、この時点で動作しても、自分自身をインスタンス化しても、他のリソースへの依存関係を追加すると、それは中断されます。また、コンテナのインスタンスが既に用意されています。なぜ、他のインスタンスを作成するのですか?

0

2つ目は、毎回そのインスタンスを作成しないためです。 @Autowiredアノテーションは、必要なときにオブジェクトにコードを挿入します。

チェックこの http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html

しかし、そこ@Controller注釈があると、あなたがautowireしたいBeanのコントローラと@Serviceのためにそれを使用する必要があります。

1

最初にもっと多くの作業が必要です。まず、毎回Controllerクラスの新しいインスタンスを作成したいのですか?

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

9

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

+2

+1、そしてミルウォーキー出身で、基本的に私のコメントを繰り返してください。 – dardo

4

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

解決方法: あなたのcontrollersに関連付けられていることをアドバイスします。 AccountControllerがある場合、AccountServiceクラス(インターフェイス+実装)とAccountDao(インターフェイス+実装)があります。今

LoginController)ユーザがログインもし、あなたがLoginControllerAccountServiceをautowireますので、あなたはアカウントが必要です、あなたはAccountService方法の中から、ユーザーのアカウントの詳細を取得します。

9

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

return "redirect:/yourDestinationControllerPath"; 
関連する問題