有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ejb3.0 java ejb3@PostConstruct

我正在JBoss上试验EJB3,开发一个无状态bean。基本上,一旦部署了模块,我就需要执行一些与加载应用程序设置相关的操作。 为此,我将一个方法注释为@PostConstruct,据我在API中所知,它指示容器在部署bean之后和投入使用之前调用它。(对吗?) 现在,我感到困惑,因为从日志上看,这个方法看起来不像是在部署之后调用的,而是在调用每个公开的方法之前调用的。 我只需要调用该方法一次,而不是每次它收到调用时。最好的方法是什么

提前谢谢

亚历山德罗·伊拉尔多


共 (5) 个答案

  1. # 1 楼答案

    由应用服务器来管理EJB的生命周期。只要合适,它可能会决定构造、初始化和分解bean。可能对无状态bean的每次调用都是在bean类的一个新实例上进行的,尽管这样做似乎是不合适的

    应用服务器是在同一个对象实例上多次调用@PostConstruct方法,还是每次都在不同的实例上调用?尝试在构造函数和@PostConstruct方法中粘贴日志语句

  2. # 2 楼答案

    首先,在bean上调用第一个方法之前调用PostConstruct。如果不调用任何方法,则不会调用post构造

    其次,您可以在PreDestry方法中执行反向操作以消除副作用

    不管怎样,你要做什么样的动作

  3. # 3 楼答案

    无状态bean应该是无状态的。这意味着在使用中,您既不能判断也不能关心bean是从池中提取的,还是根据您的请求构建的。我很难想象后构造如何应用于无状态环境,因为我总是使用该函数来完成bean状态的构建

    显然,JBoss要么放弃无状态bean的池化,每次都重新构建它们,要么,如果使用池化,每次都像重构一样对待它们(因为它们不应该携带状态信息)。事实上,我有点惊讶于它竟然调用了PostConstruct

  4. # 4 楼答案

    你的游泳池里有多少个SLSB?根据容器的不同,@PostConstruct可能在第一个客户端访问它之前不会被调用(不确定JBoss),所以这可能就是为什么每次访问都会被调用的原因。有趣的是,在调用方法的次数等于池大小之后,它是否停止调用post-construct方法

    如果您在后期构造方法中执行一些昂贵的操作,那么可能在启动时在SFSB中执行这些操作,并在后期构造中将该SFSB“注入”到SLSB中

  5. # 5 楼答案

    在客户端运行biz方法之前调用PostConstruct。这意味着如果bean没有被池化,容器将实例化bean,进行注入,调用@PostConstruct方法,然后允许biz方法运行

    在池be的情况下,@PostConstruct方法将在每次从池中提取bean时运行。对于无状态bean,这将在每个方法调用之间进行。对于有状态bean,这将在客户端查找或注入之后进行

    如果您需要在应用程序部署上运行一些东西,您的选项将取决于您拥有的JavaEE版本

    对于JavaEE6,您可以在包含@PostConstruct方法的@Singleton EJB上使用@Startup

    对于JavaEE5和更早版本,您必须在web存档中使用ServletContextListener。如果需要,可以让ServletContextListener调用EJB

    但是,更重要的问题是,您希望将这些应用程序设置加载到哪里?如果您处理的是非集群单JVM配置,那么您可能希望将它们加载到某种类型的单例中。在JavaEE5中,您必须自己实现singleton设计模式,或者在EE6中使用@singleton EJB类型