【问题标题】:Run code once Spring app is successfully deployed成功部署 Spring 应用程序后运行代码
【发布时间】:2013-07-09 20:06:50
【问题描述】:

Spring 应用程序中是否有办法知道初始化何时完成?部署应用程序后,我必须运行一些代码,并且我正在搜索诸如 ServletContextListener 或 Spring built-in events 之类的内容。

【问题讨论】:

  • 您需要初始化整个应用程序,还是只初始化一个特定的 bean?
  • 确实,我只需要与嵌入式数据库建立连接即可添加一些记录。所以,我的一项服务的自动装配实例。

标签: spring events spring-mvc listener


【解决方案1】:

根据您对我的评论的回复,我将回复您可以执行的多种操作来处理已初始化的 Spring bean。

  1. 您可以使用BeanPostProcessor。它有两种被视为回调的方法,我相信postProcessAfterInitialization 是您会感兴趣的方法。BeanPostProcessor 的问题是它们针对ApplicationContext 中的每个 bean 运行,所以您需要确保只查找您有兴趣应用此处理的 bean。要使用 BeanPostProcessor,只需将其定义为 ApplicationContext 的一部分。
  2. 实现InitializingBean 接口。它定义了一个由ApplicationContext 调用的方法afterPropertiesSet。这比数字 1 有优势,因为它可以逐个 bean 应用(不适用于 ApplicationContext 中的所有 bean)。
  3. 在方法上使用@PostContstuct 注释。这个注解告诉ApplicationContext 这个方法应该在bean 被初始化之后运行。这与第 2 点类似,因为它是逐个 bean 执行的。

有关ApplicationContext 的回调生命周期的更多信息,请访问this location。

【讨论】:

  • 其实我没有豆子。一旦建立数据库连接,我只想设置一些数据库记录。我可以定义一个服务或组件,但在设置了这些记录后,我不需要服务/组件,我不知道把它放在那里是否是个好主意。这样做的最佳选择是什么?
  • 您可以创建一个 bean,其唯一功能就是执行此操作。这就是我会做的。
  • 是的,我认为这是最好的选择。实例执行后可以删除还是没必要?
  • 之后不需要删除它。它的存在不应该伤害任何东西。
  • 这个消耗的内存非常小,你甚至都不会注意到它。我认为您最好将时间花在解决应用程序中的其他潜在内存问题上。
【解决方案2】:

你可以使用

【讨论】:

  • 我认为一旦应用开始部署 ContextStartedEvent 就会启动。我会试试看。就一个问题。我有主要上下文和根上下文,我该如何区分它们? Hibernate 连接在 root-context 中定义。
  • 我一直在搜索 ContextStartedEvent 并且我读到这个事件是在使用 start() 启动 ApplicationContext 时发布的,所以我不能使用它。还是谢谢。
  • 为什么不能使用?您写道:“..初始化完成时?” -- 这应该是引发“ContextStartEvent”的地方。
  • 是的,但我必须隐式运行 start 方法。事实并非如此。
  • 你对我在这里所说的有一个解释forum.springsource.org/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2021-01-17
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2011-04-15
  • 2019-12-03
相关资源
最近更新 更多