如何在应用程序上下文中重用CDI / Weld请求范围bean而几乎没有变化?

时间:2016-02-09 04:55:44

标签: java-ee cdi superclass reusability weld

假设我有一个@RequestScoped bean,其中注入了5个其他@RequestScoped个bean。

假设我需要在没有请求的应用程序作用域上重用此bean。我必须扩展所有bean并在其上添加@ApplicationScoped注释。此外,我还必须为字段创建getter / setter,并使用这些getter / setter来访问字段,以便可以在子类中覆盖它们的访问权。

这样做是否正确?有没有更简单的方法在应用程序范围的上下文中重用请求范围的bean?

1 个答案:

答案 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,因此您可以决定是否希望请求或应用程序在注入点作用域。