如何在春季初始化应用程序?

时间:2013-07-04 14:35:05

标签: java spring jsp spring-mvc initialization

现在直截了当地说,

JSP中,我将执行应用程序的初始化过程,如

<%! public void jsp_init(){

      //Initialise the domain server to create protocol
      //Create the logging file
}%>

现在我将重建我之前的申请ServletsSpring 3.2

我如何使用Spring 3.2执行此操作?

我的一个colleague说我要这样做initialization with Constructor of the Spring Controller

因为我已在controller class中为applicationContext.xml创建了bean,并且正在applicationContext.xmlContextLoadListner加载web.xml文件。

这是正确的初始化方式吗?

春天的 ApplicationListener 怎么样?

spring 3.2初始化应用程序的最佳方法是什么?

希望我们的堆栈用户能够提供一个很好的解决方案。

5 个答案:

答案 0 :(得分:9)

如果配置正确,Spring会为您做很多事情。如果你真的需要执行代码(vs使用像Log4J那样自动配置的东西),我建议你注册一个InitializingBean并覆盖afterPropertiesSet。然后,您可以将此bean定义添加到applicationContext.xml文件中:

<bean id="initializer" class="com.myproject.MyInitializer" />

因此,当应用程序完全初始化时,Spring将调用MyInitializer.afterPropertiesSet()方法。您也可以对已在应用程序上下文中注册的bean使用@PostConstruct注释,但无法保证在调用该方法时将初始化其余应用程序。如果您希望在设置完所有内容后运行它,则可以使用Initializing Bean方法。我已经使用这种策略来启动一个服务器套接字等,它需要独立于Web请求生命周期运行。

答案 1 :(得分:6)

为什么你要自己初始化spring应用程序? Spring会自动为你做: 这就是告诉服务器初始化spring的方法:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/app.xml</param-value>
  </context-param>

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

这将在部署期间发生,并且定义所有bean将被初始化(取决于懒惰)。 如果你真的想在bean初始化后做一些事情,那么在使用之前再使用InitializingBean 例子是

MyBean implements InitializingBean{
   afterPropertiesSet() {

      //do here
   }

}

答案 2 :(得分:2)

ContextLoaderListener是一种启动Spring WebApplicationContext的引导程序,而ApplicationListener更多地是在java应用程序级别而不是在Web应用程序上下文中。

ContextLoaderListener是一个很棒的标准工具,用于应用程序的上下文化,如果它有多个DispatcherServlet或某些servlet / servlet过滤器映射到不同的服务。基本上,为这些应用程序的不同servlet提供监听器是很方便的,这样你就可以进行细粒度的语境化。

我不知道您正在构建的应用程序的性质,但我认为您现在正在尝试基本的东西。如果是这种情况,即使在设置更复杂的情况下,最好在启动时加载一个控制器来处理主要的初始化例程,包括上下文化。您可以在web.xml中使用您拥有的控制器bean:

<servlet>
    <servlet-name>your-servlet</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

每当您读取某个url模式时,也可以映射和调用此servelt E.g。

@RequestMapping("/welcome")         
    public ModelAndView helloWorld() 

在Web部署描述符中,这一点就像您将servlet映射到Spring Security等其他Spring服务一样:

<servlet-mapping>
    <servlet-name>crunchify</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

因此,您并不需要使用控制器的构造函数,也不需要使用ContextLoaderListener或其他侦听器来执行简单的初始化任务。不过,在扩展应用程序时,学习它们的用例非常方便。

在此处阅读有关调度程序servlet的更多信息:

http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html

答案 3 :(得分:0)

你可以通过使用@PostConstruct的bean并在spring中注入servlet-config来实现这一点。看一下代码here和底部的一行。

<beans:bean id="PlayerImportDaoImpl"
        class="com.footieview.app.importer.dao.PlayerImportDaoImpl" />

这将在启动时注入此bean,此bean上的方法具有注释@PostConstruct - 这意味着在启动时会调用此方法。

答案 4 :(得分:0)

创建一个Spring 3 MVC应用程序,您不需要这样做!

Spring MVC支持JSP,您可以通过Annotations进行所有配置

有关示例,请参阅http://fruzenshtein.com/spring-mvc-creation-of-simple-controller-with-java-based-config/