Java 如何创建具有应用程序范围的映射?在哪里申报?

Java 如何创建具有应用程序范围的映射?在哪里申报?,java,cdi,Java,Cdi,我需要创建一个具有应用范围的映射。因此,如果user1使用class1的method1向这个映射添加一个对象,user2将使用class2的method2查找新对象 我知道有这样的注解: @ApplicationScoped 但是,我不知道应该在哪里声明或使用我的映射,以使它在应用程序部署期间的任何时间、任何地点都具有相同的状态 一个表示声明此映射的类和另一个使用此映射的类的方法的示例将非常有用。声明一个CDI bean,该CDI bean将提供此映射供其使用: @Named @Applica

我需要创建一个具有应用范围的映射。因此,如果user1使用class1的method1向这个映射添加一个对象,user2将使用class2的method2查找新对象

我知道有这样的注解:

@ApplicationScoped
但是,我不知道应该在哪里声明或使用我的映射,以使它在应用程序部署期间的任何时间、任何地点都具有相同的状态


一个表示声明此映射的类和另一个使用此映射的类的方法的示例将非常有用。

声明一个CDI bean,该CDI bean将提供此映射供其使用:

@Named
@ApplicationScoped
public class ApplicationScopedBean {
    private Map<KeyClass, ValueClass> map;
    @PostConstruct
    public void init() {
        //initialize the map and its data here
        map = new ConcurrentHashMap<>();
        map.put(..., ...);
        //...
    }
    //provide a getter for the map
    public Map<KeyClass, ValueClass> getMap() {
        return this.map;
    }
}
@Named
@适用范围
公共类应用程序CopedBean{
私人地图;
@施工后
公共void init(){
//在此处初始化地图及其数据
map=新的ConcurrentHashMap();
地图。放置(…,…);
//...
}
//为映射提供一个getter
公共地图getMap(){
返回此.map;
}
}

现在,可以将bean注入客户端,并在您的视图中显示数据。

声明一个CDIBean,该CDIBean将提供此
映射供其使用:

@Named
@ApplicationScoped
public class ApplicationScopedBean {
    private Map<KeyClass, ValueClass> map;
    @PostConstruct
    public void init() {
        //initialize the map and its data here
        map = new ConcurrentHashMap<>();
        map.put(..., ...);
        //...
    }
    //provide a getter for the map
    public Map<KeyClass, ValueClass> getMap() {
        return this.map;
    }
}
@Named
@适用范围
公共类应用程序CopedBean{
私人地图;
@施工后
公共void init(){
//在此处初始化地图及其数据
map=新的ConcurrentHashMap();
地图。放置(…,…);
//...
}
//为映射提供一个getter
公共地图getMap(){
返回此.map;
}
}

现在,bean可以注入客户端,并可以在您的视图中显示数据。

我不确定您是否有使用Java语言的经验。但是为什么不在类中创建一个静态变量呢

例如:

class A {

  public static Map<String, String> globalMap;

}
A类{
公共静态地图;
}
从B类,您可以在任何地方访问或设置它(当然,您需要在顶部导入A类):

B类{
公共空间{
Map anyMap anyMap=new HashMap();
anyMap.put(“anyString”、“anyString”);
A.globalMap=anyMap;
}
}

我不确定您对Java语言的体验。但是为什么不在类中创建一个静态变量呢

例如:

class A {

  public static Map<String, String> globalMap;

}
A类{
公共静态地图;
}
从B类,您可以在任何地方访问或设置它(当然,您需要在顶部导入A类):

B类{
公共空间{
Map anyMap anyMap=new HashMap();
anyMap.put(“anyString”、“anyString”);
A.globalMap=anyMap;
}
}

您是在使用JSF还是CDI?在全局单例对象中声明并管理它?@DanTemple永远避免使用单例。@Luigimendoza,我是用CDI工作的,先生。您是在使用JSF还是CDI?在全局单例对象中声明并管理它?@DanTemple永远避免使用单例。@Luigimendoza,我是用CDI工作的,先生,静态变量不是应用范围,而是类加载器范围。这并不总是一回事。静态构造在JEE应用程序中经常被误用…感谢Isaac的评论!静态变量不是应用程序作用域,而是类加载器作用域。这并不总是一回事。静态构造在JEE应用程序中经常被误用…感谢Isaac的评论!