什么是非范围bean以及何时使用它?
有人可以解释什么是无范围和目的吗?
假设我有一个豆子
request scope as r1 session scope as s1 application scope a1
并且说我没有将范围bean n1注入到上述每个范围中,然后我发现当实例化其父bean [r1 / s1 / a1]时,n1将被实例化为每个父bean。
a1中的无范围bean在a1中始终可用,因为a1是appl范围。 s1中的无范围bean只有在s1未被销毁且s1再次创建时才可用,n1将被实例化并可供其使用。
这是对的吗?
以及使用它的目的是什么? 只是为了避免创造这样的豆我们自己?
非常感谢
将在引用该bean的每个EL表达式上创建一个具有
为none
或@NoneScoped
注释的bean。 它没有被JSF存储在任何地方。 如有必要,调用者必须自己存储已评估的引用。
例如,视图中的以下内容
#{noneScopedBean.someProperty}
#{noneScopedBean.someProperty}
#{noneScopedBean.someProperty}
在一个无范围的bean上,在请求期间将构造 bean 3(三次)。 每次访问bean都会提供一个完全独立的bean,它在访问属性后立即被使用。
但是,以下是例如会话范围的bean
@ManagedProperty("#{noneScopedBean}") private NoneScopedBean noneScopedBean;
只要会话作用域bean实例,它将使它生效。 您应该只确保通过#{sessionScopedBean.noneScopedBean.someProperty}
在视图中访问它。
因此,当您希望无范围数据作为任意bean中的托管属性可用时,它可能很有用。
当我的“视图逻辑”不需要在任何范围内但被另一个ManagedBean引用时,我正在使用@nonescoped。
我正在与Liferay合作,因为我想使我的架构和设计独立于liferay,我创建我的服务接口和Dto,但是当你需要持久性数据时,Liferay需要从视图层发出companyId和companyGroupId(在这种情况下JSF)。
为了保持独立性,我做了一个“适配器模式”,使用@noneScope创建一个ServiceLayer ManagedBean,其接口独立于Liferay。 通过这种方式,我可以获得Liferay Apis所需的companyId和companyGroupId。
使用@noneScope的优点是您可以在任何范围的任何bean中将其用作@ManagedProperty。
@NoneScoped在以下场景中会有所帮助。
假设我们必须在两个不同的scoped bean中注入相同的bean,我们可以将该bean标记为@NoneScoped。 假设一个带有@NoneScoped的bean BeanOne可以很容易地注入任何带有@Request或@Session等任何范围的bean。
如果不对BeanOne使用@NoneScoped,我们可能必须复制具有不同范围的bean并相应地注入它们。
- 通过Java发送电子邮件 – javax.mail.MessagingException:无法连接到SMTP主机:localhost,port:587;
- 用于将Java的JSON转换为C#的映射工具
- 在数组上调用.length与保存大小变量的性能是否存在差异?
- DatabaseMetaData.getColumns返回同义词的空ResultSet
- Intellij IDEA checkstyle
- 无法设置gradle:’无法找到主类:org.gradle.launcher.GradleMain。’
- Java,在multithreadingevnironments中通过散列统一划分传入的工作
- JVM检查入口方法main(String args )的返回类型是否为空而不是其他任何内容的原因和原因?
- 独立的字节码validation器