为什么要有多个托管bean?

时间:2010-07-27 20:15:44

标签: java web-applications jsf scope

这是一个更普遍的问题,因此我更好地了解JSF和托管bean。因此,当人们拥有多个托管bean时,是否仅仅是因为他们想要将具有相同作用域(RequestScoped,ApplicationScoped,SessionScope ...)的方法组合在一起?还是有其他原因吗?如果将具有不同范围的托管bean注入另一个范围,会发生什么?为什么他们想要将一个具有不同范围的bean注入另一个bean,难道我不能仅仅根据我的需要从JSF访问不同的bean而不是将一个bean注入另一个bean吗?

2 个答案:

答案 0 :(得分:4)

  

因此,当人们拥有多个托管bean时,是否仅仅是因为他们想要将具有相同作用域(RequestScoped,ApplicationScoped,SessionScope ...)的方法组合在一起?还是有其他原因吗?

这取决于bean拥有的数据和bean的职责。如果它包含请求范围数据(例如表单输入值和表单操作),那么bean应该进入请求范围。如果它保存会话作用域数据(例如登录用户,用户特定设置,如语言环境等),那么bean应该进入会话范围。如果它包含应用程序范围的数据(例如,下拉值和其他应用程序范围的常量),那么bean应该进入应用程序范围。它具有逻辑意义。

  

如果将具有不同范围的托管bean注入另一个范围,会发生什么?

您只能在另一个bean中注入相同或更广范围的bean。例如。请求,会话或应用程序作用域bean可以在请求范围的bean中注入。 JSF只是将它设置为目标bean的属性。这没有副作用。当您尝试在另一个bean中注入较窄范围的bean时,JSF已经出错。您不能在会话作用域中注入请求范围的bean。这很有道理。在同一个会话中可以有多个请求范围的bean,JSF会选择哪个?

  

为什么他们想要将一个具有不同范围的bean注入另一个bean,我可以不仅仅根据我的需要从JSF访问不同的bean而不是将一个bean注入另一个bean吗?

它只会添加令人讨厌的样板代码。为什么不让JSF透明地处理它呢?没有必要掌握JSF的职责。注射是便宜的,即使你在特定用例中不需要注入的bean,也不会有害。

答案 1 :(得分:1)

我是JSF的新手,但我必须在托管bean中看到托管bean。我个人在appliaction中有几个托管bean,因为每个人都应该是一个不同视图的控制器(一些是Session Scoped,其中大多数是Request scoped,一两个是Conversation scoped)。假设我有一个用户注册表单,然后我创建一个UserRegistrationController,它是该视图的托管bean,它有一个POJO,比如说具有视图中使用的所有属性的UserRegistration,以及一些方法,如“registerUser()” “然后将其推送到负责所有工作的服务。