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

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

第一次实施

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

第二次实施

 @Autowired private Controller controller. return this.controller.method(request, response); 

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

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

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

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

 return "redirect:/yourDestinationControllerPath"; 

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

你做错了。 请参阅Costi Ciudatu's对错误Costi Ciudatu's答案。

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

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

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

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

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

请查看http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html

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