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

我有一个应用程序。每个用户对应实体“Client”。在会话期间,用户使用他的实体。


我有 JAX-RS + EJB 应用程序。我希望这个实体在所有服务中都可见并作为一个单例使用。我想用 CDI 来实现它。


首先,用户登录到应用程序。登录后,我想从base中获取它的entity,并赋值给一个singleton,但是没有成功。我尝试了@Singleton注释 ( javax.inject)@SessionScoped和@ApplicationScoped.


我该怎么做?


//Entity

@Entity

@SessionScope //or @Singlton/@ApplicationScope

class 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

@Inject

Client client;

//use entity

我不想在整个应用程序中传输指向实例的链接,但我希望使用 CDI 在任何地方都可以使用它。


或者我是否需要创建一个单独的ClientDAO,这将是我的单身人士?


暮色呼如
浏览 117回答 1
1回答

千万里不及你

根据您的评论,您必须使用@SessionScope. 如果您希望所有用户都拥有一个实例,则可以使用@Singletonand 。@ApplicationScope解决您的问题:你想Client在用户登录时实例化。所以当你在登录服务中时,这个对象还没有实例化,所以你不能把@Inject它放到你的登录服务中,你应该记得删除注释@Inject。您需要使用@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应该可行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java