我想澄清一个疑问。我正在创建自己的服务类来操纵数据。我应该在类级别(在MVCPortlet中)创建此服务实例,还是在我的processAction / doView方法中创建新实例。 使用实例级别时是否存在线程安全问题。
纤维蛋白原:
public class MvcCycle extends MVCPortlet {
int counter;
LdapService ldapservice;
@Override
public void init() throws PortletException {
counter=0;
ldapservice = new LdapService(); // Option 1
super.init();
}
@Override
public void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
// TODO Auto-generated method stub
System.out.println("Counter hits "+ ++counter);
//
LdapService ldapservice = new LdapService(); // Option 2
ldapservice.authUser(request.getParameter("email"));
// -- some code--
super.doView(renderRequest, renderResponse);
}
@Override
public void destroy() {
System.out.println("Last counter "+counter);
counter=0;
super.destroy();
}
}
class LdapService{
public boolean authUser(String email){
if(//logic to authenticate user){
return true;
}else{
return false;
}
}
}
在这里,我的ldapservice只启动一次。所以当多次点击时。这个时候哪个代码对Option1或Option 2有用。
希望我已经解决了我的问题。
答案 0 :(得分:0)
跟进你的评论:总的来说:这取决于你。我们没有足够的信息为您提供空白的架构建议。
在Liferay的上下文中,即使您没有数据库交互,也可以使用服务构建器。只需创建一个空实体,就可以获得没有持久性的服务。
<entity name="MyService" local="true"/>
就是这样。现在实现MyServiceLocalServiceImpl添加你已经完成
在您澄清之后编辑:它没有任何区别。我仍然建议你的portlet中不实例化,因为这会使你的portlet依赖于服务实现。例如。我仍然和服务建设者一起去。
您还询问线程安全性,这也取决于您的实现。您的示例代码是线程安全的,但实际代码可能不是。你的判断。