Spring如何执行方法

时间:2012-02-07 20:28:49

标签: java spring tomcat dependency-injection

我知道这个问题与Execute method on startup in spring重复。但是我已经尝试了在该问题的公认答案中发布的建议,但没有任何对我有用。因此,我怀疑虽然这里提出了相同的问题,但我强烈认为根本原因是不同的,因此需要不同的答案/解决方案。

我试图让Spring在启动时创建一个bean并立即执行其中一个方法。

我的春季配置(heartbeat-config.xml):

<beans (all the xmlns stuff here ommitted for brevity)>
    <bean id="heartbeat" class="org.me.heartbeat.Heartbeat"/>
</beans>

Heartbeat.java

public class Heartbeat
{
    @PostConstruct
    public void start()
    {
        System.out.println("I should see this message in the logs somewhere!!");
    }
}

最后,我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <!-- The display name of this web application -->
    <display-name>Heartbeat</display-name>

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

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

当我在Tomcat中运行它时,我没有任何启动错误。 Tomcat看起来像运行健康(我可以从日志中看出)。但是,我没有看到日志中的任何输出应该由我的System.out方法中的start()调用生成(Tomcat将所有标准输出重定向到其日志文件)。

我在这里俯瞰什么吗?我可以做一个明显的诊断吗?

1 个答案:

答案 0 :(得分:3)

最简单的方法是忘记注释并将bean定义更改为:

<bean id="heartbeat" class="org.me.heartbeat.Heartbeat" init-method="start"/>

如果需要注释,则需要声明上下文命名空间并将其放入applicationContext.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <!-- Enable @PostConstruct, @PreDestroy and friends in Spring -->
    <context:annotation-config/>

    <bean id="heartbeat" class="org.me.heartbeat.Heartbeat"/>
</beans>

注意:检查名称空间,它们是从网络上复制的。