java - 注入(inject)后初始化(JSF 1.2 + Guice)

标签 java jsf dependency-injection annotations guice

我正在尝试将 Guice 集成到 JSF 1.2 (Sun RI) 应用程序中,并且我希望能够对我的托管 beans 执行以下操作:

  1. 使用 Guice @Inject 注解注入(inject)依赖,然后
  2. 使用@PostConstruct注解执行初始化

我的问题是 @PostConstruct 方法总是在处理 @Inject 注释之前被调用。有谁知道这个问题的解决方案吗?

托管bean:

public final class Foo {

    @Inject private BazService bazService;
    private Baz baz;

    @PostConstruct
    public void init() {
        bar = bazService.loadBaz();
    }

    public void setBazService(BazService bazService) {
        this.bazService = bazService;
    }
}

托管 bean 声明:

<managed-bean>
  <managed-bean-name>foo</managed-bean-name>
  <managed-bean-class>bean.Foo</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>id</property-name>
    <value>#{param.id}</value>
  </managed-property>
</managed-bean>

Guice 绑定(bind):

public final class MyGuiceModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(BazService.class).to(DummyBazService.class).in(Scopes.SINGLETON);
    }
}

我试过以下方法:

如果这似乎是处理问题的错误方式,我很乐意考虑其他选择...感谢任何帮助。


编辑

我使用的是 Guice 1.0。我现在已经升级到 Guice 2.0,但问题仍然存在。我找到了 some discussion that seems to relate to my issue ...但我不明白如何使用这些信息:(

最佳答案

不幸的是,我没有给你答案,但我会这样说......

让对象 self 注入(inject)看起来可行——您不一定要使用父类(super class):

public final class Foo {

  @Inject
  private BazService bazService;
  private Baz baz;

  @PostConstruct
  public void init() {
    InjectorFinder.getInjector().injectMembers(this);
    baz = bazService.loadBaz();
  }

  public void setBazService(BazService bazService) {
    this.bazService = bazService;
  }

}

我也认为没有理由保留对注入(inject)器的引用,因此考虑一个实用程序类:

public class InjectorFinder {
  public static Injector getInjector() {
    FacesContext facesContext = FacesContext
        .getCurrentInstance();
    ExternalContext extContext = facesContext
        .getExternalContext();
    Map<String, Object> applicationMap = extContext
        .getApplicationMap();
    return (Injector) applicationMap.get(Injector.class
        .getName());
  }
}

@PostConstruct 和序列化会发生什么吗?这是我没有考虑太多的事情,但它可能会影响 session bean。


这看起来不像是一种可靠的技术。如果我没看错代码,每次解析对象时都会注入(inject)依赖项。


我怀疑这个补丁存在我提到的问题(不同的解析器,同一作者,无论如何)。除了错误,尝试同时使用两种不同的 JSF 实现(Sun 和 Apache)是行不通的。


我在野外见过几个 Guice/JSF 项目(guicesfjsf-sugar ;也许还有更多?)但没有尝试过,所以我不知道它们是否对您有帮助,甚至不知道如何他们很稳定。

无论您做什么,都可以关注 Web Beans。 (概述 here)因为这可能会影响 JSF 中 future 的 bean 处理功能(如果我正确理解 Guice 在堆栈中的位置,您可以使用它来实现 Web Beans - 不是我推荐的你这样做)。

关于java - 注入(inject)后初始化(JSF 1.2 + Guice),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/886114/

相关文章:

java - 压测服务端点,使用x个线程发送100K请求

java - 基于不带比较器的成员变量的排序来对对象进行排序

java - IntelliJ IDEA 调试器在 macOS 上启动太慢

java - 使用递归的幂函数

java - JSF 中的托管 bean

jsf - 传递作为 EL 操作方法参数传递的请求范围变量不起作用

entity-framework - 每次使用都需要创建/处理的项目的依赖注入(inject)

java - 如何在运行时控制 OSGi 中的依赖注入(inject)

java - 如何将 JSF 语言环境传播到应用程序中的其他层

dependency-injection - lombok 和 guice 注入(inject)