假设我有一个@RequestScoped
bean,其中注入了5个其他@RequestScoped
个bean。
假设我需要在没有请求的应用程序作用域上重用此bean。我必须扩展所有bean并在其上添加@ApplicationScoped
注释。此外,我还必须为字段创建getter / setter,并使用这些getter / setter来访问字段,以便可以在子类中覆盖它们的访问权。
这样做是否正确?有没有更简单的方法在应用程序范围的上下文中重用请求范围的bean?
答案 0 :(得分:0)
如果我理解正确,你可能会通过“制作人方法”使用丑陋的黑客攻击。问题似乎是,你有一些 RequestScope bean,你想把它移到 ApplicationScope 。
你可以这样做:
@Produces @ApplicationScope
public SomeInterface getSomeBean(@New SomeBean bean) {
return bean;
}
通过这个,您可以将bean“推广”到另一个范围。注意@ApplicationScope
注释促进它,并注意方法上的@New
注释,它基本上说CDI忽略正常的bean范围而只是创建一个新的范围。
剩下的问题是请求范围依赖性bean
仍然存在。您可以通过将@New
全部注入方法中来解决此问题。类似的东西:
@Produces @ApplicationScope
public SomeInterface getSomeBean(
@New SomeDependency1 dep1,
@New SomeDependency2 dep2,
...) {
return new SomeBean(dep1, dep2, ...);
}
所以基本上手动创建具有“提升”依赖关系的bean。
注意:您可能必须限定一个或两个bean,因此您可以决定是否希望请求或应用程序在注入点作用域。