Java 在Spring3中执行常规站点初始化的单个类
因此,一旦Spring扫描并实例化了所有内容,我希望我的webapp运行一些代码来查找持久化中的某些项,如果它们不存在,则使用属性文件中的值创建新项,然后持久化它们。。。。只是一些一般的初始化 目前,我正在使用一个实现ApplicationListener的类。这似乎是一个正常的处理方法,但它似乎运行了两次。我必须添加一个私有布尔值,并在onApplicationEvent方法中检查它,以确保代码只运行一次:Java 在Spring3中执行常规站点初始化的单个类,java,spring,spring-mvc,initialization,Java,Spring,Spring Mvc,Initialization,因此,一旦Spring扫描并实例化了所有内容,我希望我的webapp运行一些代码来查找持久化中的某些项,如果它们不存在,则使用属性文件中的值创建新项,然后持久化它们。。。。只是一些一般的初始化 目前,我正在使用一个实现ApplicationListener的类。这似乎是一个正常的处理方法,但它似乎运行了两次。我必须添加一个私有布尔值,并在onApplicationEvent方法中检查它,以确保代码只运行一次: private boolean initialized = false;
private boolean initialized = false;
@Override
public void onApplicationEvent(ContextRefreshedEvent e) {
if (initialized){
return;
}
initializeStuff();
initialized = true;
}
这让我觉得我可能不是用最好的方式
有人对如何正确处理这个问题有什么建议吗?我发现的最简单的方法(当然,假设您启用了注释处理)是将您的初始化放在一个已用
@javax.annotation.PostConstruct
注释的方法中。只有在满足包含该方法的bean的所有依赖项之后,才会调用该方法
@PostConstruct
public void initializeStuff() {
// ...
}
最好将您需要的任何初始化拆分,以便bean负责定义自己的初始化,而不是将知识覆盖在一个大的“初始化世界”方法中
(您也可以通过XML配置来启用这类功能,但我发现通过注释来处理这类功能更简单,即使在对其他所有内容使用XML配置时也是如此,因为调用初始值设定项是bean不可分割的一部分。)它执行两次,因为我假设,您在
ContextLoaderListener
中有这个bean,还有一个DispatcherServlet
都会触发一个ContextRefreshedEvent
。DispatcherServlet
中的事件会冒泡到父级,因此ApplicationListener
会执行两次
您可能希望将该类移动到DispatcherServlet
,以便它执行一次(事件只向上冒泡,不向下冒泡)
使用WebApplicationUtils
从上下文中检索bean,而不是将其设置为ServletContextListener
,它在ContextLoaderListener
之后加载。这保证在应用程序启动期间执行一次
或者创建一个实现
初始化bean
的类,或者用@PostConstruct
注入bean并在方法中加载数据 问题是,我没有试图初始化单个类,我需要更复杂的代码交互。我调用访问多个DAO的多个服务,我正在建立web服务连接,等等。我需要确保在运行初始化代码时,Spring已经构建并完成了所有内容。@Bal然后我将放入一个bean来执行调用,这取决于其他bean。我相信依赖顺序是用来控制@PostConstruct
调用的顺序的。谢谢。。。我使用注释来声明这个bean,而不是XML。我如何确保只有DispatcherServlet执行它?类声明:@Component公共类初始值设定项通过将其添加到由DispatcherServlet
加载的上下文中来实现ApplicationListener。