【问题标题】:Java EE and Spring MVC "bootstrap" / run code at server startJava EE 和 Spring MVC “引导程序”/在服务器启动时运行代码
【发布时间】:2012-04-12 13:39:20
【问题描述】:

我正在使用 Spring MVC 3.05。

我想知道创建引导类的最佳方法是什么?想想 Grails。 在之前的一个项目中,我相信另一个人声明了一个 spring bean 和一个调度器,但我也记得它有点难看:

<bean id="bootstrap" class="com.jobs.Bootstrap" />

<task:scheduler id="SpringScheduele" />
<task:scheduled-tasks scheduler="SpringScheduele">
<task:scheduled ref="bootstrap" method="onServerStart" fixed-delay="5000000000" /
</task:scheduled-tasks>

我相信这会让它在启动时触发,然后等待它再次触发。不太理想。

public class Bootstrap {

    public void onServerStart() {
        System.out.println("....");        
    }    
}

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: java spring jakarta-ee spring-mvc


    【解决方案1】:

    你必须创建一个实现ApplicationListener并监听ContextRefreshedEvent的bean:

    @Component
    public class Bootstrap implements ApplicationListener<ContextRefreshedEvent> {
        @Override
        void onApplicationEvent(ContextRefreshedEvent event) 
            ...  
        }    
    }
    

    【讨论】:

    • 如果您想确保在引导之前创建和初始化所有的 bean,那么这是要走的路。
    • 谢谢。我猜那时所有 EJB 和 DB 的东西都会被加载?
    • 不应该是ApplicationContextEvent而不是刷新的那个吗?我只希望它在启动时运行一次,我猜另一个会在代码更改时运行它然后发布..
    • 或者可能是 ContextStartedEvent 因为 ApplicationContextEvent 是一个抽象类...
    • ContextStartedEvent 不起作用,它不会触发...不知道为什么...但是刷新可以!
    【解决方案2】:

    我想你可以创建一个实现InitializingBean 的类,例如像这样:

    public class Bootstrap implements InitializingBean {
        @Value("${my.prop.value}")
        Integer somePropValue;
    
        @Overrides
        public void afterPropertiesSet() {
            // runs after constructor & setter injection
        }
    }
    

    【讨论】:

    • 我刚刚尝试了完全相同的示例。但该方法似乎没有触发。我需要做其他事情吗?定义一个 bean ?我确实在 xml 配置文件中有注释驱动...
    • 将@Component 添加到类中,以便组件扫描将实例化 bean。
    猜你喜欢
    • 2012-12-25
    • 2014-11-13
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2013-06-13
    • 2013-11-04
    相关资源
    最近更新 更多