【问题标题】:Understanding spring singleton to load entities at startup了解spring单例在启动时加载实体
【发布时间】:2016-02-02 17:54:42
【问题描述】:

我想实现一个功能,在部署时,我应该从数据库中加载对象列表。数据库已经完成了相应的实现,正在动态使用。

鉴于我是 Spring 新手,我正在尝试了解 Spring 的不同特性,我可以利用这些特性来实现这个特性。如果我不使用 Spring,我会拥有

  • 创建了线程安全的单例类
  • 在应用程序加载时按 servlet 生命周期加载该类
  • 加载该单例类中的所有内容并覆盖现有的数据库类以在发出查询之前检查此单例类。这样,仅当由于某种原因未加载此类时才会发出查询。

现在,在春天,我很困惑。我一直在阅读不同的文章并试图找到一些指示。首先,我应该使用@Component 来制作单例类吗? spring 会照顾线程安全吗?

其次,这个类是 Service 的 spring 类吗?我必须用 @Service 注释它吗?

第三,我应该在启动时使用@PostConstruct 来加载这个类吗?还是有其他更好的选择?

【问题讨论】:

  • 所有 Spring bean 默认都是单例的(在 Spring 的上下文中只有一个实例)
  • 你认为这段代码会在应用程序第一次启动时加载以加载所有内容吗? pastebin.com/yHEE5xaQ
  • 当然,我对实体缓存做了同样的事情
  • 所以我在这里得到空会话。我该怎么办?

标签: java spring multithreading spring-mvc


【解决方案1】:

以下是您问题的答案:

首先,我应该使用@Component 来制作单例类吗? spring 会照顾线程安全吗?

@Component 用于在基于 XML 的 Spring 配置中进行组件扫描以创建 Spring Bean。一个 Bean 将创建任何类的单例实例。

其次,这个类会是 Spring 的 Service 类吗?我必须用@Service注释它吗?

@Service 只不过是@Component 的专业化。继续使用@Service@Repository或者替换成@Component完全没问题。

第三,我应该在启动时使用@PostConstruct 来加载这个类吗?还是有其他更好的选择?

@PostConstruct 在 bean 创建后只会运行一次。如果您想在应用程序第一次启动时将数据从数据库加载到缓存等,则可以使用它。

【讨论】:

  • 所以根据你的建议,这段代码将达到我正在寻找的目的pastebin.com/yHEE5xaQ。所以这个类,将在应用程序部署时自动调用,它的 post-construct 方法将加载所有内容......我说得对吗?
  • 我忘了问我如何访问这个课程?我应该像普通课程一样访问它,即MyEntityCache me = new MyEntityCache()吗?还是我应该通过 Spring 上下文获取?
  • 你可以使用@Autowired注解注入它。
  • 是的,我想通了。不过谢谢:)
  • 还是没有回答你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多