Jakarta ee EJB在每次业务方法调用之前重新注入所有依赖项

Jakarta ee EJB在每次业务方法调用之前重新注入所有依赖项,jakarta-ee,dependency-injection,cdi,ejb-3.1,stateless-session-bean,Jakarta Ee,Dependency Injection,Cdi,Ejb 3.1,Stateless Session Bean,这个问题毫无疑问,事实上是一个提示 您知道会话EJB在每次业务方法调用之前都会重新注入所有依赖项吗?直到几分钟前我才知道,这让我很头疼 我认为依赖注入只发生在实例的创建中,但这不是事实。EJB3.1的规范说明: “如果会话bean使用依赖注入,则容器在创建bean实例之后,在对bean实例调用任何业务方法之前,注入这些引用。”第4.3.2节 不知何故,这个定义可以赋予无状态会话Bean会话状态的能力,这正是我所需要的。例如,如果在SLSB中注入@SessionScoped bean,而不依赖于池

这个问题毫无疑问,事实上是一个提示

您知道会话EJB在每次业务方法调用之前都会重新注入所有依赖项吗?直到几分钟前我才知道,这让我很头疼

我认为依赖注入只发生在实例的创建中,但这不是事实。EJB3.1的规范说明:

“如果会话bean使用依赖注入,则容器在创建bean实例之后,在对bean实例调用任何业务方法之前,注入这些引用。”第4.3.2节

不知何故,这个定义可以赋予无状态会话Bean会话状态的能力,这正是我所需要的。例如,如果在SLSB中注入@SessionScoped bean,而不依赖于池的哪个实例处理您的请求,那么SessionScoped bean将始终符合当前客户端的会话。换句话说,SLSB实例不可能有另一个客户端的SessionScoped bean

这样,如果两个用户交替使用同一个SLSB实例,SLSB将通过@Inject接收记录的用户作为实例字段,而不会产生任何问题。例如:

@Stateless
public class StatelessSessionBean{
    @Inject
    @LoggedInUser
    protected User loggedInUser;//@SessionScoped

    public void test(){
        System.out.println("ejb:"+this);
        System.out.println("user:"+this.loggedInUser);
    }
}
然后,各种“测试”方法调用的结果如下:

User 1 invoke
17:02:20,800 INFO  [stdout] (http--0.0.0.0-8080-5) ejb:AccessControlBean@406189
17:02:20,801 INFO  [stdout] (http--0.0.0.0-8080-5) user:User 1

User 2 invoke
17:02:56,227 INFO  [stdout] (http--0.0.0.0-8080-8) ejb:AccessControlBean@406189
17:02:56,228 INFO  [stdout] (http--0.0.0.0-8080-8) user:User 2

User 2 invoke
17:03:24,376 INFO  [stdout] (http--0.0.0.0-8080-8) ejb:AccessControlBean@406189
17:03:24,378 INFO  [stdout] (http--0.0.0.0-8080-8) user:User 2

User 1 invoke
17:03:24,517 INFO  [stdout] (http--0.0.0.0-8080-6) ejb:AccessControlBean@1c05227
17:03:24,518 INFO  [stdout] (http--0.0.0.0-8080-6) user:User 1

User 1 invoke
17:04:24,045 INFO  [stdout] (http--0.0.0.0-8080-1) ejb:AccessControlBean@406189
17:04:24,047 INFO  [stdout] (http--0.0.0.0-8080-1) user:User 1

User 2 invoke
17:04:24,179 INFO  [stdout] (http--0.0.0.0-8080-8) ejb:AccessControlBean@1c05227
17:04:24,179 INFO  [stdout] (http--0.0.0.0-8080-8) user:User 2

请注意,即使调用同一实例,字段“loggedInUser”也会根据调用该方法的用户而正确变化。

您有什么问题吗?所以不是一个博客平台。顺便说一句,依赖项注入只在创建之后发生。参见规范第100页。Hi JB!我并没有我在文章的第一行提到的问题,但是,我认为这将是有效的注册这个技巧,因为它会导致非常混乱。无论如何,如果我违反了StackOverflow的规则,我很抱歉。我阅读了第100页,没有评论说依赖注入只发生在创建中。如果存在,则说明将相互矛盾,因为第74页第4.3.2节说依赖项注入发生在创建时和对业务方法的每次调用中。这个问题似乎脱离主题,因为它不是一个问题