gpt4 book ai didi

java - 如何将 bean 保存(持久化、序列化)到磁盘并在下次 Spring 运行时恢复(反序列化)它们?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:14 24 4
gpt4 key购买 nike

我希望我的应用程序记住它在磁盘上的状态。所以,我的一些 bean 是有状态的,我希望保存和加载它们的状态。

假设我正在用类似的方法创建 bean

@Bean
MyBean myBean() {
MyBean ans;
if( /* bean is already written to disk */ ) {
ans = readMyBean();
}
else {
ans = new MyBean();
ans.property1 = defaultValue1;
// ...
}
return ans;

}

这是正确的方法吗?或者我需要考虑一些现有的 Spring API?

在哪里调用保存方法?

更新

目前我的做法如下

我正在使用 AnnotationConfigApplicationContext 创建我的应用程序。我为它提供 java 配置类,并为 bean 提供适当的创建者。

序列化在业务逻辑中调用,反序列化在创建代码中进行:

public class MyConfig {

protected String getConfigName() {
String name = getClass().getSimpleName();
name = name.split("\\$\\$")[0];
return name;
}

@Bean
MyDirectoryBean myDirectoryBean() {
MyDirectoryBean ans = new MyDirectoryBean (new File("data/" + getConfigName()));
return ans;
}

@Bean(name="mybean")
MyBean myBean() {

MyBean ans = (MyBean) myDirectoryBean().deserialize("mybean");
if( ans == null ) {
ans =new MyBean();
ans.setMyParameter1(100); // etc
}
return ans;

}
}

我的类 MyDirectoryBean 能够序列化和反序列化 bean。

不幸的是,这种方式需要我对 bean 名称进行两次编码:在 bean creator 注释中和在发生反序列化的行中。

我正在想象一些界面来拦截创建过程。可能是一些 BeanPreProcessor 类?通过没有这样的类。也许我可以在我的自定义上下文中覆盖 getBean() 方法,以便它首先尝试反序列化 bean?

最佳答案

简单的答案是序列化,你可以找到很多关于如何序列化对象和反序列化对象的例子,例如:

http://www.javapractices.com/topic/TopicAction.do?Id=45 http://www.tutorialspoint.com/java/java_serialization.htm

您可以在@Bean 方法中编写反序列化代码。

但我有 2 场辩论,既基于使用数据和 getter/setter 在 java bean 中提取数据,又基于此 java bean 使您的 bean 可配置

  1. 使用 jpa 将这个 java bean 保存在 DB 上,您可以将 H2 数据库与 jdbc:h2:~/test 或 jdbc:h2:file:/data/sample 一起使用
  2. 使用 Spring 资源并将您的数据放入属性文件中,然后使用 @Value 读取它

关于java - 如何将 bean 保存(持久化、序列化)到磁盘并在下次 Spring 运行时恢复(反序列化)它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28860685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com