在春天为所有课程提供课程实例?

时间:2017-05-11 16:46:06

标签: java spring

我有一个基本上只包含HashMap的类。

该类还有一个简单的getter方法,它允许我的应用程序的其他部分发送“密钥”并从地图中获取值。

然而,这很有用,我不想在每次需要访问它时都继续实例化该类,因为这个特定的数据并没有真正改变,我只是想在地图中查询它以便查询它很快就能达到我需要的价值。

我希望我的主应用程序类创建一个这样的实例,然后让它自动提供给我的所有其他类。

今天早上我一直在阅读这篇文章很多,但我对如何实现这一点感到困惑,我是不是想做一些单身人士?或者我是否尝试使用服务?

无论如何,如果有人有我可以学习的片段 - 那真的会帮助我。我目前正在使用Annotations来处理春天的大部分内容,并且希望保持这种方式。

1 个答案:

答案 0 :(得分:1)

如果您想继续使用Spring,可以使用@Component创建一个简单的组件。默认情况下,所有组件都是单例。您可以使用@PostConstruct初始化数据。以下是一个例子。我使用String作为地图密钥,但您可以修改它以匹配您的应用。

@Component
public class MyMap {
    private Map<String, Object> theMap = new HashMap<>();

    // PostConstruct runs after the application context instantiates the bean
    @PostConstruct
    public void init() {
        // initialize the data in theMap
    }

    public Object get(String key) {
        return theMap.get(key);
    }
 }

然后,您可以使用@Autowired注释或应用程序上下文来检索bean:

public class AnotherClass {
    @Autowired
    MyMap myMap;
    // ...
}

如果你想避开Spring,另一种选择是创建一个简单的Java单例。这是一个例子

public class MyMap {
    private final static Map<String, Object> theMap = new HashMap<>();

    // Use a static block to initialize the map with data
    static {
         // populate theMap with data
    }

    public Object get(String key) {
        return theMap.get(key);
    }
}

需要注意的一点是,如果您的地图确实得到了更新,那么您将需要处理并发读取和更新。