我知道这个问题与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将所有标准输出重定向到其日志文件)。
我在这里俯瞰什么吗?我可以做一个明显的诊断吗?
答案 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>
注意:检查名称空间,它们是从网络上复制的。