如何在没有 web.xml 的情况下使用 Spring 和 Tomcat?

4
我有一个JAX-RS应用程序部署在Tomcat 7上。我在Tomcat上部署应用程序时没有使用任何web.xml文件。
我想要使用Spring来注入我的项目中的一些依赖项。我没有使用任何XML文件来配置bean,而是创建了一个类并用@Configuration注释进行注释,其中包含所有bean定义。现在,我正在尝试通过用@Autowired注释单独类中的字段来使用该bean,但该字段为空。
如何使Spring与此设置配合工作?
编辑: 我能够通过在WEB-INF/中创建一个web.xml来初始化Spring应用程序上下文,并具有以下内容。
<web-app>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

我查看了Tomcat日志,并确认该bean是由Spring创建的。但问题在于,当我尝试使用该bean时,类中的字段为空。


1
只需将每个有用的问题标记为“太宽泛”。做得好,版主们! - Pratik Singhal
4个回答

2
您可能想要使用Spring Boot,它可以帮助您开发Web应用程序,就像开发一个“只需运行”的独立应用程序一样容易。
根据Spring Boot的官方网站,您可以创建:
  • 创建独立的Spring应用程序
  • 直接嵌入Tomcat、Jetty或Undertow(无需部署WAR文件)
  • 提供“starter” POMs来简化您的Maven配置
  • 尽可能自动配置Spring
  • 提供生产就绪功能,如指标、健康检查和外部配置
  • 绝对没有代码生成和XML配置要求
您可以在短短1小时内学会它,我发现这个YouTube视频非常有趣,请观看Getting Started with Spring Boot

1
这可能适用于一个新项目,但我不能将现有项目切换到spring-boot。 - Pratik Singhal

0
如果你想在一个类中使用 @Autowired,那么它首先必须是一个 Bean。你可以通过在类上注释 @Component 或者在 Configuration 中使用 @Bean 注解来实现这一点。
@Bean
Yourclass yourclass(){
     return new YourClass();
}

其次,您需要将@ComponentScan注释添加到您的配置中。
@ComponentScan("your.package")
@Configuration

第三步,您必须实例化一个ApplicationContext。例如像这样

JavaConfigApplicationContext context = new JavaConfigApplicationContext(YourConfig.class);

因为它是一个Web应用程序,最好查看WebApplicationInitializer,实现自己的初始化上下文。


0
你所缺少的是初始化Spring Dispatcher Servlet的方法。你需要实现接口WebApplicationInitializer,并在这个类中传递所有应用程序所需的Java配置。
你必须定义AnnotationConfigWebApplicationContext,在这里你可以注册你的配置类:
context.register(MyConfig.class);

或者你可以定义包含所有配置类的基础包:

context.setConfigLocation("com.example.app.config");

完整示例:

    public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context
          = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.example.app.config");

        container.addListener(new ContextLoaderListener(context));

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));

        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

最后一件事,如果您使用Maven,请不要忘记在pom.xml中将属性failOnmissingwebxml设置为false
您可以在这里找到更多信息。

在查看文档和其他类似问题后,我创建了一个web.xml文件并添加了一个监听器 <web-app> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>。现在,这个监听器已经被加载并且Spring Bean已经初始化,但是当我尝试使用Bean时,它是null。我已经尝试过@Autowired和@Resource注解。 - Pratik Singhal
我更新了我的问题,请查看我发布的链接。 - Dimitri

0

但问题在于应用程序中没有主函数。 - Pratik Singhal
你可以选择任何起始点。无论你的主应用程序在哪里启动,你都可以在那里加载Spring上下文,并启用所有Spring功能。 - Vineet Kasat
我不理解“您可以选择任何起点”的意思。您是什么意思? - Pratik Singhal
我们在Java应用程序中有一个main()函数作为入口点。你的应用程序入口点是什么?你在Tomcat中部署了什么? - Vineet Kasat
我部署了一个JAX-RS应用程序。可能会有一个入口点,但我没有显式地定义它。 - Pratik Singhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接