2012-10-11 274 views
7

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

1日实施

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依赖关系,一旦你添加了对其他资源的依赖关系,它就会中断。此外,您已经有一个为您创建容器的实例,为什么要创建其他实例?

1

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

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

9

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

+2

+1为好的做法,并从密尔沃基,并基本上重申我的意见。 – dardo

4

你完全错了。请参阅Costi Ciudatu's回答有什么不对。

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

现在,如果在(LoginController)用户登录,你需要考虑,所以你会在LoginController自动装配AccountService,你会得到AccountService方法用户帐户的详细信息。

9

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

return "redirect:/yourDestinationControllerPath"; 
相关问题