【问题标题】:Does spring have a way to load up things when the application first loads? At a global levelspring 是否有办法在应用程序首次加载时加载内容?在全球范围内
【发布时间】:2012-01-15 04:54:11
【问题描述】:

在 MVC 加载时,框架中是否有任何 spring 特定的方式来执行初始化?

假设我需要根据配置文件创建全局对象,有没有地方可以这样做,还是我只是创建自己的 servlet 并在 oninit 中执行此操作?

【问题讨论】:

标签: java spring servlets spring-mvc


【解决方案1】:

标准的@PostConstruct呢?

@Service
class AnySpringBean {

    @PostConstruct
    public void init() {
        //run when bean is created
    }

}

也适用于@Controllers。

更新:更全局的地方是子类ContextLoaderListener)并覆盖contextInitialized()并在web.xml中使用它(参见user1076371answer) .我不太喜欢这种方法,但至少初始化没有绑定到任何 Spring bean。

【讨论】:

  • 我正在寻找一个更全球化的地方,不是真正特定于控制器,而是整个应用程序。
  • 或者我可以手动执行此操作,然后在 spring 之外使用过滤器对吗?在我的控制器之前触发的东西,这可能吗?在应用程序启动时?
  • ContextLoaderListener 扩展了 Servlet API 的标准 ServletContextListener。您可以创建自己的 ServletContextListener 完全独立于 Spring。
【解决方案2】:

最好的办法是将它留给 Spring。将您的全局对象 bean(可能是单例等)添加到您的应用程序上下文中。通过将 ContextLoaderListener 添加到 web.xml,确保在加载应用程序时初始化 Spring。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4">

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

</web-app>

您可以在应用程序的任何位置从 WebApplicationContext 访问您的全局对象。

【讨论】:

  • 你的建议和克里斯一样吗?
  • 这是不同但更简单的 IMO。您不需要在现有类中实现任何接口。假设你想在一个名为 SocketMonitor 的类中调用一个名为 initializeSocketDaemon 的方法,你会添加一个像这样的 bean 。如果你有一个像上面这样的监听器,Spring 会在 web 应用启动时加载,然后调用这个方法。
【解决方案3】:

您可以实现一个 ApplicationListener 接口来挂钩启动完成事件。在我知道 Spring 完成启动后,我在我的应用程序中使用它来做事。我有几个不同的类,我想在系统“启动”后启动后台线程,并且每个类都实现了这个接口来执行它们特定的启动后工作。

它是在整个应用程序完成后发送的,但是每个监听的 spring bean 都会收到一个事件,所以你可以将它挂接到一些现有的 bean 中,或者创建一个类似 PostStartupBean 的东西,它的存在只是为了实现这个方法。

public void onApplicationEvent( ApplicationEvent applicationEvent )
{
   if ( applicationEvent instanceof ContextRefreshedEvent )
   {
      ..do stuff here..
   }
}

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多