我不知道这是否是实现我的解决方案的更好方法:
@Component
@Scope("singleton")
public class GetFromJson implements Serializable{
/**
*
*/
private static final long serialVersionUID = -8203722696439228358L;
Map<String, Map<String, ArrayList<String>>> jsonMap;
public Map<String, Map<String, ArrayList<String>>> getJsonMap() {
return jsonMap;
}
public void setJsonMap(Map<String, Map<String, ArrayList<String>>> jsonMap) {
this.jsonMap= jsonMap;
}
}
该类可序列化,因为我从数据库的Json获取内容,并将内容映射到对象GetFromJson中(我只需要在数据库中进行一次查询)。因此,我需要在所有APp中使用对象,因此,我认为我需要使用Singleton
有人向我发布了一个从数据库获取JSON的库。由于这个原因,JSON对象解析为Map<String, Map<String, ArrayList<String>>>
,因此我创建了GetFromJson
类。
现在我有很多休息服务,在休息服务中,我需要使用我的对象:GetFromJson以获取jsonMap的内容。
我有很多问题。
使用注释@Scope("singleton")
可以保证GetFromJson
在我的所有应用中只有一个实例可用吗?
或者在春季在我的应用中提供单例和会话对象的更好方法是什么?
要获取GetFromJson的jsonMap的内容就足以使用
@Autowired
private GetFromJson jsonObject;
或者我如何获得单例课程?
在我的其余方法服务中使用:
jsonObject.getJsonMap();
如何初始化我的单身人士,因为我正在尝试使用以下方法初始化对象:
@Autowired
private GetFromJson jsonObject;
public methodToInitialize(){
jsonObject = methodLibraryFromDatabase(GetFromJson.class);
}
IDE告诉我未使用字段初始化
我需要相同的逻辑,但是对于会话对象,我认为如果我理解会话对象的单例实现将是相同的,只是将注释更改为:@Scope("session")
答案 0 :(得分:1)
我认为OP希望在应用程序生命周期中一次初始化基于数据库的POJO,并在需要时自动将其接线。
通常,这是通过创建一个bean(除非另有说明,为单例)并在需要的地方自动装配完成的。
该示例应该可以帮助您入门。
@Configuration // beans are declerated in @Configuration classes
public class GetJsonInitializer {
@Bean // singleton by default
public GetFromJson jsonMap(){
GetFromJson jsonObject = methodLibraryDatabase(GetFromJson.class);
return jsonOBject;
}
}
现在可以在任何Spring服务/组件等中自动装配GetFromJson
。
@Service
public class SomeService {
@Autowired
private GetFromJson jsonMap;
}
希望这会有所帮助!
答案 1 :(得分:0)
带有会话范围注释的bean将绑定到用户的会话生命周期,也就是说,对于每个访问您的应用程序的用户,您将拥有一个此类的实例。如果您只想保证应用程序中此Bean的一个实例(在JVM级别),则只需删除@Scope批注。但是,如果要将单例与会话范围的Bean混合使用,则应该让spring为您无缝处理所有事情,会话范围的Bean仅在用户会话结束时被销毁。
处理bean中初始化代码的最佳方法是在公共方法中加上javax.annotation.PostConstruct
@PostConstruct
public void setUp() {
//initialization code
}
为了在销毁bean时处理清理代码,应使您的类实现org.springframework.beans.factory.DisposableBean
或添加带有javax.annotation.PreDestroy
注释的方法
@PreDestroy
public void onDestroy() {
//clean up code
}
我希望这对您有所帮助!