Java 在Spring3中执行常规站点初始化的单个类

Java 在Spring3中执行常规站点初始化的单个类,java,spring,spring-mvc,initialization,Java,Spring,Spring Mvc,Initialization,因此,一旦Spring扫描并实例化了所有内容,我希望我的webapp运行一些代码来查找持久化中的某些项,如果它们不存在,则使用属性文件中的值创建新项,然后持久化它们。。。。只是一些一般的初始化 目前,我正在使用一个实现ApplicationListener的类。这似乎是一个正常的处理方法,但它似乎运行了两次。我必须添加一个私有布尔值,并在onApplicationEvent方法中检查它,以确保代码只运行一次: private boolean initialized = false;

因此,一旦Spring扫描并实例化了所有内容,我希望我的webapp运行一些代码来查找持久化中的某些项,如果它们不存在,则使用属性文件中的值创建新项,然后持久化它们。。。。只是一些一般的初始化

目前,我正在使用一个实现ApplicationListener的类。这似乎是一个正常的处理方法,但它似乎运行了两次。我必须添加一个私有布尔值,并在onApplicationEvent方法中检查它,以确保代码只运行一次:

    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。