在玩!我可以在模型包 Singleton 中制作 类 框架作品吗?

In Play! Frame work Can I Make classes In models package Singleton?

我是新来玩的!现在玩!大致适用于路由、控制器和模型。 models 中的 classes 用 @Entity 注释,它在数据库中变成了 table,所以我们可以让 class 它变成一个单例,这样我就可以用一个接口进一步实现它并有效地使用它
如果模型包中的 class 是单例的,那么它是每个会话单例还是整个应用程序单例
我会提供一些粗略的例子,我不能 post 真实的代码,因为我工作的公司不允许我这样做,我真的很抱歉

旧版本代码如下

Code for MyModelN class in Models package as there are many such Model classes containing the same kind of methods

   @Entity   
   @Table(name == "MyModelN")   
   class MyModelN{
     public static String column1;
     public static String column2;
     .............
     public static String coulmnN;

     public static MyModelN findAll(){
         return /*Some JPA code*/
     }
     public static MyModelN findId(){
         return /*Some JPA code*/
     }
      /*And so On*/  
 }

Code For MyControllerN class in Controllers package there are many such controllers

  class MyControllerN extends Controller{
    public static Result create(){
      /*Some code which uses the models ...*/
      MyModelN.finAll();  
      return ok();
    }
     /*And so On*/  
 }

Code for the routes file

GET           /finance/create               controller.MyControllerN.create()

The above code works fine and serves the purpose , But it contains about 70% code redundant in every controller .So to make it modular and reusable I made an Interface IFinance that extends MyModelN and I made a commonController class which contains the common code of every controller and i wish to use the IFinance handle in the commonController class .......The new version is as follows
Code for MyModelN class in Models package as mentioned before (This time no static)

   @Entity   
   @Table(name == "MyModelN")   
   class MyModelN implementes IFinance{
     public String column1;
     public String column2;
     .............
     public String coulmnN;

     public MyModelN findAll(){
         return /*Some JPA code*/
     }
     public MyModelN findId(){
         return /*Some JPA code*/
     }
      /*And so On*/  
 }

Code For MyControllerN class in Controllers package as mentioned above (Now no static)

  class MyControllerN extends Controller{
    private IFinance iFinance;
    private MyModelN myModelN = new MyModelN();
    private CommonController commonController = new CommonController(myModelN);
    public Result create(){
       /*Some code which uses the models ...*/
       return commonController.createCommon(); 
    }
     /*And so On*/  
 }

Code for CommonController

class MyControllerN extends Controller{
    private IFinance iFinance;
    MyControllerN(IFinance iFinance){
     this.iFinance = iFinance;
    }
    public Result createCommon(){
       /*Some code which uses the models ...*/
       iFinance.findAll();
       return ok()
    }
     /*And so On*/  
 }

Code for the routes file is dynamic instead of static

GET           /finance/create               @controller.MyControllerN.create()

This works fine for me , here the issue is in every controller I end up making a new object of MyModelN classes whenever I have to use it in Controller,

  1. 所以我想知道我是否可以制作我的 MyModelN classes 单例,这样我在每个地方都会得到相同的对象,并且我不会最终为模型创建很多对象,因为它是使用 static 可以正常工作我认为单例可以工作,但我不确定
  2. 现在,如果某些 MyModelN class 依赖于其他 @ManytoOne MyModel1 myModel1@OnetoMany MyModel1 myModel,我再次为该模型创建新对象,所以如果我将其设为单例,我将得到同一个对象,但它会引起一些干扰和数据混淆的问题吗?
  3. 我想知道 Play 如何在内部处理这个问题,当我创建一个 MyModels class 单例时,它是每个会话还是整个应用程序的单例,如果它是整个应用程序的单例那么怎么会这样许多用户同时使用该网站,他们的数据不会与其他用户混淆

谢谢

嘿 Pushkar 我不是很清楚你问的问题,但我会根据我对你问题的理解尝试尽可能接近

所以回答后面的问题第一个单例涉及静态的使用,所以它的范围是整个应用程序生命周期单例的定义也是如此,只需要在应用程序中创建一个单例对象。因此 class 作为单例在整个应用程序生命周期中都是单例。

现在回到前面的问题,由于上述原因,我认为您不应该将模型设为单例。模型应该特定于特定会话而不是应用程序。

希望我回答了你的问题。

经过对 Play 的研究!框架 我想回答这个问题

  1. 当我们制作一个用@Entity 注释的class 单例时,Class 是每个会话的单例还是整个应用程序的单例?

    • 是的,Class 是整个应用程序的单例,即在整个应用程序
    • 中只会创建一个单例实例 class
  2. 是否建议保留您的模型 class 即 Class 用 @Entity Singleton/Static 注释?

    • 不,不建议保留 class 单例,因为当多个用户同时使用同一个@Entity class 时,这会导致数据不一致

我们必须明白Play! FrameworkPlay 是一个无状态、异步和非阻塞的框架,它使用底层的 fork-join 线程池来窃取网络操作的工作,并且可以在用户级别利用 Akka operations.For more Chek this Link click here

所以当我们使用动态路由时,每次客户端点击控制器时都会创建一个控制器的新实例Class(一个扩展播放控制器的Class),更多信息

但是如果我们创建任何其他 Class 单例,我们将在整个应用程序中获得相同的单例实例 class all/any 播放控制器实例

谢谢