我需要通过我已有的服务从外部属性文件加载init参数。 这部分是经过测试的,但是我很难在应用程序启动时注入我的init参数并使它们可以被整个应用程序访问。我应该使用applicationScoped托管bean吗?
提前致谢
答案 0 :(得分:2)
创建EJB启动服务
@Startup
单例的引入也为EJB提供了一种便捷的方式 应用程序初始化期间接收回调的应用程序 关掉。默认情况下,容器决定何时实例化 单身实例。但是,您可以强制容器 在应用程序初始化期间实例化单例实例 使用 @Startup 注释。这允许bean定义一个 保证在启动时调用的@PostConstruct方法。 此外,保证单身的任何@PreDestroy方法 在应用程序关闭时调用,无论是否 使用惰性实例化或急切实例化单例 实例。在惰性实例化中,单例不被实例化 直到首先需要它的方法。在急切的实例化中, 单例在启动时被实例化,无论它是否被使用。
@Singleton
@Startup
public class StartupBean {
@PostConstruct
private void startup() { ... }
@PreDestroy
private void shutdown() { ... }
...
}
如果您处于群集环境中,这可能不起作用 你开箱即用。这仅适用于单个VM。你将会有 你的StartupBean在每个服务器实例启动或调用时调用 关闭。如果您有特殊的群集要求(例如,仅限于此 初始化一次完整的集群)你必须考虑 使用数据库同步StartupBeans。适用于任何EJB 3.1兼容容器和高度便携。这甚至应该适用于轻量级Java EE 6 Webprofile
https://blogs.oracle.com/enterprisetechtips/entry/a_sampling_of_ejb_3
答案 1 :(得分:1)
如果您想使用ManagedBean
Eager Application-Scoped Beans托管bean被懒惰地实例化。 也就是说,当从请求发出请求时它们被实例化 应用
强制实例化应用程序范围的bean并将其放入 应用程序启动时及之前的应用程序范围 任何请求,托管bean的eager属性应该是 设置为true,如以下示例所示:
@ManagedBean(eager=true)
@ApplicationScoped