Java Tomcat运行服务而不是web应用程序

Java Tomcat运行服务而不是web应用程序,java,spring,tomcat,Java,Spring,Tomcat,我想使用Tomcat简单地启动一个服务,而不是一个servlet 我知道Tomcat是一个servlet容器,而不是应用服务器,但这是架构师为我们设置的平台。 我希望在Tomcat启动后立即执行一个Java类,该类将从Spring上下文加载一个类并对其调用一些方法 我认为最好的方法是创建一个监听器,它将使用ClassPathXmlApplicationContext从Spring上下文加载我的bean,并对其调用所需的方法 有更好的方法吗?生命周期侦听器是基于某些Tomcat操作(通常是Tomc

我想使用Tomcat简单地启动一个服务,而不是一个servlet

我知道Tomcat是一个servlet容器,而不是应用服务器,但这是架构师为我们设置的平台。

我希望在Tomcat启动后立即执行一个Java类,该类将从Spring上下文加载一个类并对其调用一些方法

我认为最好的方法是创建一个监听器,它将使用ClassPathXmlApplicationContext从Spring上下文加载我的bean,并对其调用所需的方法


有更好的方法吗?

生命周期侦听器是基于某些Tomcat操作(通常是Tomcat启动或关闭)触发应用程序事件的标准方法。由于您的目标是在Tomcat启动时调用一个类方法,因此将此调用放在侦听器中最有意义。监听器调用Springbean还是简单POJO是任意的,就哪种方法更好而言;这个问题的答案应该由应用程序的需求决定,例如,您是否需要Spring上下文来使应用程序的其他部分更容易构建

要在侦听器中调用Springbean,可以在web.xml中使用以下定义:

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/applicationContext.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

上下文配置位置
/WEB-INF/spring/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
您可以利用注释。这将在创建bean并将所有必要的资源注入bean之后执行一个方法。这是一个示例:

@Service
public class MyBean {
    @PostConstruct
    public void init() {
        //construction logic here...
        //printing a message for demonstration purposes
        System.out.println("Bean is already created and resources have been injected!");
    }
}
要使用
@PostConstruct
,请考虑:

  • bean必须由容器实例化。这是:Spring、EJB、CDI等
  • 只能有一个由
    @PostConstruct
    修饰的方法
  • 此方法必须是
    public
    ,返回
    void
    ,并且没有参数

使用这种方法,您的应用程序中不需要额外的侦听器。

您尝试了什么?是的,使用spring,您可以使用spring侦听器启动一个方法,并在初始化后调用init方法。我还想问架构师为什么选择Tomcat,以及我如何适应该计划,只是为了确保我没有遗漏任何东西。只需声明您的bean并将
@PostConstruct
注释添加到
public void whicher()
方法。请注意,该方法应该是
public
,返回
void
,并且没有参数。然后,一旦容器(Spring或其他)创建了对象,它就会被容器调用。我在问是否还有其他更有利的方法。@LuiggiMendoza,如果你将此作为答案发布,我会将其标记为已接受。这是一种享受。