0

我最终决定看看 Tomcat 中的 Weld。当我部署我的应用程序时,我在日志中看到:

“检测到 Tomcat 7,CDI 注入将在 Servlet 和过滤器中可用”

例如,如何使用过滤器/Servlet 之外的 BeanManager 创建 bean 的实例?

我有一个豆子:

@javax.inject.Named(value="CarService")
@javax.enterprise.context.RequestScoped
public class CarService implements Serializable{
.
.
.

我想使用 BeanManager 为指定的请求上下文创建它的一个实例。

Context ctx = new InitialContext();
BeanManager manager = (BeanManager) ctx.lookup("java:comp/env/BeanManager");
// NOW WHAT?

如果这可以在 servlet/过滤器中完成,我相信它可以在其他任何地方完成,但我只是不想通过 Weld 代码并在不先询问的情况下自己弄清楚。

非常感谢。

4

2 回答 2

2

我已经使用了这个 Seam 代码,它给了我所需的一切。

public static <T> T getContextualInstance(final BeanManager manager, final Class<T> type) {
        T result = null;
        Bean<T> bean = (Bean<T>) manager.resolve(manager.getBeans(type));
        if (bean != null) {
            CreationalContext<T> context = manager.createCreationalContext(bean);
            if (context != null) {
                result = (T) manager.getReference(bean, type, context);
            }
        }
        return result;
    }
于 2011-08-21T18:26:53.187 回答
2

使用BeanManager是你应该很少做的事情。关键是@Inject在需要依赖的地方使用(即依赖注入)。使用管理器是“服务定位器”模式。

如果您真的需要它,请使用manager.getBeans(yourDesiredClass),然后从集合中选择一个并调用manager.getReference(bean, theClass, ctx)ctx将获得manager.createCreationalContext(bean)

于 2011-08-21T16:13:18.057 回答