在托管bean

时间:2016-02-05 09:14:29

标签: java jsf jsf-2.2

我在托管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();
    }
}

1 个答案:

答案 0 :(得分:0)

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

调用@ApplicationScoped知道第一个bean将被加载因为@Inject是不正确的,但是只要数据源上没有多线程或适当的管理,它就会起作用。< / p>

我不确定如何收集垃圾。

我会使用CDI @ ManagedProperty(过去的@Autowired - 仍然像魅力一样)或Spring setError来注入其他资源实例,bean,EJB,服务等。

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