【问题标题】:Referencing of class variables (static) within managed beans在托管 bean 中引用类变量(静态)
【发布时间】:2016-02-05 09:14:28
【问题描述】:

我在托管 bean 中有一个类(静态)变量。从另一个托管 bean 中引用此类变量是否合法,如下所示:

@ManagedBean
@ApplicationScoped
public class FooBean {
    private Context ctx;
    public static DataSource ds;

    @PostConstruct
    public void init() {
        ctx = new InitialContext();
        ds = (DataSource) ctx.lookup("java:comp/env/foobar");
    }        
}

@ManagedBean
@RequestScoped
public class BarBean {
    public void foobar() {
        // Is that legal and save?
        Connection conn = FooBean.ds.getConnection();
    }
}

我应该改用依赖注入吗?

@ManagedBean
@RequestScoped
public class BarBean {
    @ManagedProperty(value = "#{fooBean}")
    private FooBean fooBean;

    public void foobar() {
        Connection conn = fooBean.get_ds().getConnection();
    }
}

【问题讨论】:

    标签: java jsf jsf-2.2


    【解决方案1】:

    它会起作用,因为在 BarBean 调用 FooBean.ds.getConnection(); 之前已经加载了 FooBean ,这在它们的范围内不会成为问题。

    知道第一个 bean 将被加载,因为是 @ApplicationScoped,所以调用 FooBean.ds.getConnection(); 看起来不正确,但只要您的数据源上没有多线程或适当的管理,它就会工作。

    我不确定它会如何收集垃圾。

    我会使用 CDI @Inject(旧的 @ ManagedProperty - 虽然仍然像魅力一样工作)或 Spring @Autowired 来注入其他资源实例、bean、EJB、服务等。

    所以我的答案是对静态类成员使用依赖注入的力量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2015-04-20
      • 2011-09-01
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多