我们可以在类静态块中调用ejb吗?

时间:2019-01-20 02:47:26

标签: java ejb

是否想知道我们是否可以在类静态块中调用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
    }
}

1 个答案:

答案 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。