Bean单例,会话创建和初始化

时间:2018-06-29 16:29:28

标签: java spring spring-mvc spring-boot

我不知道这是否是实现我的解决方案的更好方法:

@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")

2 个答案:

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

我希望这对您有所帮助!