15

我正在处理使用一个控制器调用第二个控制器上的方法的现有代码。到目前为止,我已经看到了 2 个实现。

第一次实施

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

第二次实施

@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

如果你在 Controller 之间进行调用,要么存在缺陷,要么你想进行重定向,这是完全有效的。如果重定向是这种情况,只需在您的控制器方法中返回如下:

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

听起来您需要重构代码。将两个控制器之间的共同点提取到一个单独的类中,然后从任一控制器调用它。

于 2012-10-11T21:38:16.517 回答
4

你做错了。看看Costi Ciudatu's有什么问题的答案。

解决方案:我建议您service layer and dao layer classes与您的controllers. 假设你有AccountController,你将有AccountService类(接口+实现)和AccountDao(接口+实现)。

现在,如果用户登录 ( LoginController) 并且您需要帐户以便您将自动连接AccountServiceLoginController您将从AccountService方法中获取用户的帐户详细信息。

于 2012-10-12T06:32:37.013 回答
1

第一个需要更多的工作,首先你真的想每次都创建一个新的 Controller 类实例吗?

第二种使用称为依赖注入或控制反转的模式更好。让 spring 为您管理 bean 的范围,默认情况下它只会创建 Controller 类的 1 个实例,但是如果在某些时候(出于某种原因)您不希望这种行为直接创建许多实例......

于 2012-10-11T21:00:32.973 回答
0

第二个是正确的,因为您不会每次都创建它的实例。@Autowired 注释在需要时将对象注入到您的代码中。

检查这个 http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html

但是有一个 @Controller 注释,你应该将它用于控制器,@Service 用于你想要自动装配的 bean。

于 2012-10-11T20:58:29.473 回答