是否想知道我们是否可以在类静态块中调用Stateless Ejb来从数据库中检索数据,如下所示?谢谢。
public class MyCacheManager {
private static final HashMap states = new HashMap();
//Can we inject stateless ejb here ?
public static String getState(String abbrev) {
return (String) states.get(abbrev);
}
static {
// can we call stateless ejb method here to retrieve data from
database ?
//JDBC stuff to load the data
}
}
更新的评论
我决定使用Singleton类,而不是使用静态块,因为了解singleton适合存储信息,而静态块通常用于创建常用功能。
由于某些原因,我现在需要使用POJO在JDK 6中实现Singleton模式,以存储静态哈希图,而不是使用Singleton EJB。如下所示的程序调用流程和结构,因此想获得在技术上是否可行的建议,包括以下查询?谢谢,安妮。
1)ServletContextListener类使用MySingleton.getInstance()方法在Singleton POJO下实例化吗?
2)使用Session EJB注入的Singleton类调用DAO以使用@Inject和CDI beans.xml填充静态哈希图?
3)所有EJB都使用MySingleton.getInstance()。authenticateLogin语法调用单例Pojo的公共方法来访问静态哈希图吗?
4)如果我使用“最终课程MySingleton”或不使用最终语言,会有什么不同?
package org.common.authenticate;
public final class MySingleton {
private static MySingleton instance;
private HashMap<String, AuthenInfo> authenInfo;
// Inject EJB to call DAO for retrieving authentication information?
@Inject
private MyAuthenticateEjb myAuthenticateEjb;
private MySingleton() {
// Use above MyAuthenticateEjb to retrieve authenticate info and
// populate the HashMap authenInfo
}
public static MySingleton getInstance()
{
if (instance == null) {
instance = new MySingleton();
}
return instance;
}
public Boolean authenticateLogin(String userNm, String pwd, String
apiName) {
// use above authenInfo HashMap to authenticate whether system is
// authorised to the call API
}
}
答案 0 :(得分:2)
恐怕不是。静态块至少在第一次构造函数调用之前执行一次,并且只执行一次。另一方面,注入是在执行实例构造函数之后进行的。
如果您正在考虑将注入的字段设为static
,请参见this。不允许。 @Stateless
(或例如@Singleton
)的意义在于,容器负责处理bean的“静态”性质。
但本质上:您将尝试使用static
上下文中的实例变量。
@PostConstruct
可能会帮助您解决问题。查看更多信息why。
还请注意是否使用实例初始化程序(而不是使用static
),例如:
{
// can we call stateless ejb method here to retrieve data from
}
它也将在构造函数之前调用。
如果不是必需的注入,则可以尝试在静态块中进行JNDI搜索。但是,根据执行静态块的阶段而定,它可能会导致无法预测的结果-如果它甚至可以工作,则不能确定-因此不建议使用。
通常,每当需要这种静态访问时,都可以创建一个像这样的bean:
@Startup // make init eagerly
@Singleton
public class StaticHelperBean {
@Inject
private SomeBean someBeanInstance;
@Getter
private static SomeBean someBean;
@Getter
private static SomeStuff someStuff;
@PostConstruct
private void postConstruct {
someBean = someBeanInstance;
someStuff = someStuffInit();
}
}
但这是不得已的方法。您应该始终首先尝试设计软件,以便可以在需要的地方注入无状态bean。