EJB和静态字段

时间:2017-07-20 18:09:14

标签: java-ee garbage-collection ejb classloader static-variables

我想在无状态会话bean中有一个静态只读集合。理想情况下,只要应用程序正在运行,它就只会初始化一次并可用于bean实例。

假设此应用程序部署在具有多个服务器/ JVM的集群环境中。

据我了解,在第一种情况下,静态变量barList在容器创建bean的同时被初始化,并且与bean一样长(或者甚至更长?)并且那里有'在bean实例活着的时候没有被垃圾收集的危险。

在第二种情况下,当Foo类被加载时,barList被初始化,这是bean的getBarList()方法被执行时。它回来后会发生什么? bean方法执行完毕后会被销毁吗?

案例1:

@Stateless
public class MrBean implements BeanInterface{

private static final List<Bar> barList;

static{

barList = new ArrayList<Bar>();

//create some bars, add them to the list

}

public List<Bar> getBarList(){

    return barList;
}
}

案例2:

@Stateless
public class MrBean implements BeanInterface{

public List<Bar> getBarList (){

return Foo.barList;

}

}

public class Foo {

public static final List<Bar> barList;

static{ 

barList = new ArrayList<Bar>();

// create bars, add them to barList 

}

}

1 个答案:

答案 0 :(得分:0)

我宁愿创建一个@Singleton bean,让它管理并提供列表。那么你有以下优势:

  1. 列表仅针对整个应用程序初始化一次,并且不必是static,因此您符合EJB标准。
  2. EJB和列表可以在应用程序启动时初始化,而不是通过@Startup@PostConstruct注释进行EJB初始化。
  3. 可以使用@Lock(READ) @Lock(WRITE)同时访问/操作列表。
  4. 您可以在其中一个EJB方法中使用@Observes模式来响应事件并在需要时重新加载列表