Jakarta ee javaee单例注释don';行不通

Jakarta ee javaee单例注释don';行不通,jakarta-ee,annotations,singleton,Jakarta Ee,Annotations,Singleton,我的例子是: import javax.ejb.Singleton; import javax.ejb.Startup; import java.util.Random; @Startup @Singleton public class Singleton1 { Random random = new Random(); int a = random.nextInt(); int b = random.nextInt(); } 主要类别: import javax

我的例子是:

import javax.ejb.Singleton;
import javax.ejb.Startup;
import java.util.Random;

@Startup
@Singleton
public class Singleton1 {

    Random random = new Random();

    int a = random.nextInt();
    int b = random.nextInt();
}
主要类别:

import javax.inject.Inject;
import static java.lang.System.*;

public class ThisMain {
    @Inject
    private static Singleton1 obj;



    public static void main(String[] args) {

         obj = new Singleton1();


        for (int count = 0; count < 7; count++) {
            out.println(obj.a);
            out.println(obj.b);
            obj = new Singleton1();
        }
    }
}
import javax.inject.inject;
导入静态java.lang.System.*;
公共类ThisMain{
@注入
专用静态单声道1 obj;
公共静态void main(字符串[]args){
obj=新单音1();
对于(int count=0;count<7;count++){
out.println(obj.a);
out.println(obj.b);
obj=新单音1();
}
}
}
结果是:

1165198576 -845405303 276858760 -464660166 1929818899 289671820 1187666549 96727476

我以为随机变量也是一样的。 我做错了什么


请给我举一个工作示例。

这里有很多问题。您正在使用javaeeapi
@Singleton
。如果您想使用
@Singleton
,您需要将类打包到WAR、EAR或EJBJAR文件中,并将其部署到应用程序服务器(或其他JavaEE容器)

当您使用JavaEEAPI并注入它们时,应用程序部署到的容器会仔细实例化它们,这样您就永远不会使用
new
来创建新实例

如果您不想使用JavaEEAPI,并且只想使用JavaSEAPI,那么您有两个选择

您可以使用CDI依赖项注入框架来管理单例。在这种情况下,您应该将
@Singleton
(这是一个EJB API,您可以从它的导入中看出),更改为
@ApplicationScoped
。如果这样做,您可以保留
@Inject
行,并去掉
obj=new Singleton1()
,因为CDI容器将看到
@Inject
,而obj将是对CDI托管实例的非空引用

另一种选择是简单地用java创建一个“老式”单例。例如:

  public class Singleton1 {
    private static Singleton1 ourInstance = new Singleton1();

    private static Singleton1 getInstance() { return ourInstance; }

    private Singleton1() {}
  }
然后您可以去掉
@injectprivate静态Singleton1 obj和更改
obj=new Singleton1()
to
Singleton1 obj=Singleton1.getInstance()


无论您选择什么解决方案,您都希望摆脱
obj=new Singleton1()在循环中。你永远不想创建新的单例实例。

为什么你认为
@singleton
会神奇地阻止你创建新实例??
@Singleton
所做的是确保每次注入相同的实例。在这里,我看不到任何其他DI框架使用CDI。注释并不神奇,它们是元数据。你需要一个图书馆来实际使用它们…谢谢你的回答!你能解释一下我需要什么样的库吗?你需要在JavaEE6(或更好的)服务器上运行你的代码,注入才能像我一样工作expected@SteveC因为这显然不是一个网络应用,它也不是那么简单。谢谢!我将进一步了解jee)