我在托管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();
}
}
答案 0 :(得分:0)
它会起作用,因为FooBean
已经在BarBean
调用FooBean.ds.getConnection();
之前加载了FooBean.ds.getConnection();
,因为它们的范围不会成为问题。
调用@ApplicationScoped
知道第一个bean将被加载因为@Inject
是不正确的,但是只要数据源上没有多线程或适当的管理,它就会起作用。< / p>
我不确定如何收集垃圾。
我会使用CDI @ ManagedProperty
(过去的@Autowired
- 仍然像魅力一样)或Spring setError
来注入其他资源实例,bean,EJB,服务等。
所以我的答案是使用依赖注入的力量而不是静态类成员。