现在直截了当地说,
在JSP
中,我将执行应用程序的初始化过程,如
<%! public void jsp_init(){
//Initialise the domain server to create protocol
//Create the logging file
}%>
现在我将重建我之前的申请Servlets
至Spring 3.2
。
我如何使用Spring 3.2
执行此操作?
我的一个colleague
说我要这样做initialization with Constructor of the Spring Controller
。
因为我已在controller class
中为applicationContext.xml
创建了bean,并且正在applicationContext.xml
中ContextLoadListner
加载web.xml
文件。
这是正确的初始化方式吗?
春天的 ApplicationListener 怎么样?
在spring 3.2
初始化应用程序的最佳方法是什么?
希望我们的堆栈用户能够提供一个很好的解决方案。
答案 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的更多信息:
答案 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/。