[英]How to make an singleton instance visible everywhere using CDI?
我有一个申请。 每个用户对应于实体“客户”。 在会话期间,用户使用其实体。
我有JAX-RS + EJB应用程序。 我希望此实体作为单个实例可见并在所有服务中使用。 我想使用CDI实现它。
首先,用户登录到应用程序。 登录后,我想从基础中获取其实体并将其分配给单例,但是我没有成功。 我尝试了@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
,这将是我的单例?
根据您的评论,您必须使用@SessionScope
。 如果您想为所有用户提供一个实例,则可以使用@Singleton
和@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
应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.