为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 CDI 使单例实例随处可见?

如何使用 CDI 使单例实例随处可见?

暮色呼如 2023-03-23 15:40:48
我有一个应用程序。每个用户对应实体“Client”。在会话期间,用户使用他的实体。我有 JAX-RS + EJB 应用程序。我希望这个实体在所有服务中都可见并作为一个单例使用。我想用 CDI 来实现它。首先,用户登录到应用程序。登录后,我想从base中获取它的entity,并赋值给一个singleton,但是没有成功。我尝试了@Singleton注释 ( javax.inject)@SessionScoped和@ApplicationScoped.我该怎么做?//Entity@Entity@SessionScope //or @Singlton/@ApplicationScopeclass Client { fields }//login service@Inject Client client;//After login I want to assign an entity from db[cleintEntity] //to entity which is available everywhere[client]client = clientEntity;我想做这个://some ejb@InjectClient client;//use entity我不想在整个应用程序中传输指向实例的链接,但我希望使用 CDI 在任何地方都可以使用它。或者我是否需要创建一个单独的ClientDAO,这将是我的单身人士?
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

根据您的评论,您必须使用@SessionScope. 如果您希望所有用户都拥有一个实例,则可以使用@Singletonand 。@ApplicationScope

解决您的问题:

  1. 你想Client在用户登录时实例化。所以当你在登录服务中时,这个对象还没有实例化,所以你不能把@Inject它放到你的登录服务中,你应该记得删除注释@Inject

  2. 您需要使用@Produces注释。当你想控制你的类被实例化的方式时,使用这个注解。当 CDI 容器要查找该类的实现时Client,如果它找到一个返回Client并具有@Produces注释的方法,它会调用该方法,而不是仅仅实例化自身Client。你应该做你的登录业务,然后创建一个实例Client并将其作为成员变量存储在你的登录服务中。然后在此类中添加一个返回该客户端对象的方法,并用 注释该方法@Produces。您的登录服务的最终结构如下所示:

   @SessionScope

    public class LoginService {

        private Client client;


        public void login(String username, String password) {

            //  implement login business


            //  if login is successful

            client = clientEntity;

        }


        @Produces

        @SessionScope

        public Client clientProducer() {

            return this.client;

        }

    }

您还可以将@Produces注释放在字段之上。在这种情况下,CDI 容器将使用存储在该字段上的值而不是调用方法。


    @SessionScope

    public class LoginService {

        @Produces

        @SessionScope

        private Client client;


        public void login(String username, String password) {

            //  implement login business


            //  if login is successful

            client = clientEntity;

        }

    }

当然,这应该被视为一种伪代码。我不知道你们公司的所有细节。也许您实现逻辑的方式是完全错误的;)。但要解决这个具体问题,@Produces应该可行。


查看完整回答
反对 回复 2023-03-23
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信