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。