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()
toSingleton1 obj=Singleton1.getInstance()代码>
无论您选择什么解决方案,您都希望摆脱obj=new Singleton1()代码>在循环中。你永远不想创建新的单例实例。为什么你认为@singleton
会神奇地阻止你创建新实例??@Singleton
所做的是确保每次注入相同的实例。在这里,我看不到任何其他DI框架使用CDI。注释并不神奇,它们是元数据。你需要一个图书馆来实际使用它们…谢谢你的回答!你能解释一下我需要什么样的库吗?你需要在JavaEE6(或更好的)服务器上运行你的代码,注入才能像我一样工作expected@SteveC因为这显然不是一个网络应用,它也不是那么简单。谢谢!我将进一步了解jee)