Spring MVC,从控制器内部调用另一个控制器

时间:2012-10-11 20:55:20

标签: java spring spring-mvc

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

第一次实施

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

第二次实施

@Autowired
private Controller controller.

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

哪个是正确的实现,如果有任何问题,有什么问题。

6 个答案:

答案 0 :(得分:14)

如果您在控制器之间进行呼叫,则存在缺陷或您想要进行重定向,这是完全有效的。 如果是重定向,只需在控制器方法中返回如下:

return "redirect:/yourDestinationControllerPath";

答案 1 :(得分:13)

您需要从另一个控制器调用方法这一事实揭示了一个可能的设计缺陷。

使用选项1,您将丢失Spring DI容器带给您的所有内容:即,其他控制器可能由Spring实例化,其中一些其他依赖项连接到它。如果您自己实例化它,即使它在此时确实有效,因为您可能没有@Autowired / @Value依赖项,一旦您在其他资源上添加依赖项,它就会中断。此外,您已经有一个为您构建容器的实例,为什么要创建其他容器?

答案 2 :(得分:9)

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

答案 3 :(得分:4)

你做错了。如果出现问题,请参阅Costi Ciudatu's答案。

解决方案:我建议您service layer and dao layer classescontrollers相关联。 假设您有AccountController,您将拥有AccountService类(接口+实现)和AccountDao(接口+实现)。

现在,如果用户登录(LoginController)并且您需要帐户,那么您将在AccountService中自动加载LoginController,您将从AccountService方法获取用户的帐户详细信息。< / p>

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

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