2011-12-07 22 views
5

在MVC加载时,框架中是否有任何特定于Spring的方式来执行初始化?当应用程序第一次加载时,spring是否有办法加载事物?在全球范围内

说我需要根据配置文件创建全局对象,是否有一个地方可以做到这一点,或者我只是创建自己的servlet并在oninit中执行此操作?

+0

前三个答案都是很好的,并提供该参考本章的不同方面,应首先阅读:http://static.springsource.org/spring/docs/current/spring-framework-reference/html/ beans.html#beans-factory-lifecycle –

回答

5

那么标准@PostConstruct呢?

@Service 
class AnySpringBean { 

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

} 

适用于@Controller s。

更新:更全球地方将继承ContextLoaderListener),并覆盖contextInitialized()web.xml使用它(见user1076371answer)。我不太喜欢这种方法,但至少初始化并不与任何Spring bean绑定。

+0

我正在寻找一个更加全球化的地方,并非特定于控制器,而是整个应用程序。 – codecompleting

+0

@codecompleting:请参阅我的更新 –

+0

或者我可以手动执行此操作,然后在弹簧外部使用过滤器右键?有可能在我的控制器之前发生的事情?在应用程序启动? – codecompleting

0

最好的事情是将它留给春天。将您的全局对象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访问您的全局对象。

+0

你的建议和克里斯一样吗? – codecompleting

+0

这是不同的但更简单的国际海事组织。你不需要在你现有的类中实现任何接口。让我们假设你想在一个名为SocketMonitor的类中调用一个名为initializeSocketDaemon的方法,你可以像这样添加一个bean 。假如你有一个像上面这样的监听器,Spring将会在Web应用程序启动时加载,然后调用这个方法。 – user1076371

4

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

它是在应用程序整体完成后发送的,但它是每个侦听的spring bean都获取一个事件,因此您可以将其挂钩到某个现有bean或创建类似PostStartupBean的东西,该存储只用于实现此目的一种方法。

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