我已经使用@ApplicationScoped注释了一个类。使用@Inject,我将这个类的实例注入到几个@RequestScopded JAX-RS服务中:
@ApplicationScoped
public class MySingleton {
MySingleton() {
System.out(this + " created.");
}
}
@RequestScoped
public class MyRS {
@Inject MySingleton mySingleton;
public void someMethod() {
// do something with mySingleton
}
}
基本上这很好用。 Howeger,至少当我在WebSphere 8.5中运行它时,MySingleton的构造函数被调用两次,导致输出如
my.package.MySingleton_$$_javassist_26@cddebf9b created.
my.package.MySingleton@e51e26d1 created.
我计划在构造函数中做一些昂贵的初始化,显然会执行两次。
我相信其中一个构造函数调用是为实际的“worker”实例生成某种代理。但是如何避免我的初始化代码执行两次?在MySingleton的所有方法中进行延迟初始化的“解决方案”并不是很有吸引力。
答案 0 :(得分:7)
容器也可以调用托管bean的构造函数来创建代理。对于任何“真正的”初始化,Java EE因此提供注释@PostConstruct。在@ApplicationScoped bean中,使用@PostConstruct注释的方法仅由容器调用一次:
@ApplicationScoped
public class MySingleton {
MySingleton() {
System.out(this + " created.");
}
@PostConstruct
init() {
System.out(this + " initd.");
}
}
输出:
my.package.MySingleton_$$_javassist_26@cddebf9b created.
my.package.MySingleton@e51e26d1 created.
my.package.MySingleton@e51e26d1 initd.
答案 1 :(得分:0)
这是为您的单身人士创建的javassist代理对象。应该在创建实际对象时调用单例构造函数。