如何使用带有2个或更多servlet的Spring DI?

时间:2012-03-14 10:31:47

标签: spring java-ee dependency-injection

请原谅我是否使用了错误的术语,但我是java-web开发和Spring的新手。 如果我错了,请纠正我的假设。

我想创建一个WebApp,它使用Vaadin for UI和Spring MVC for RESTful Web-Services。 所以,我认为,我需要2个Servlet。 一个用于服务Vaadin,一个用于服务Spring MVC。

我有一些通用的dao-beans,两个servlet都使用它,所以我想,我可以使用Spring,使用@Autowired注释将这些@Repository和@Component标记的bean注入MVC​​和Vaadin- “(应用程序| Servlet的)”。 (通过弹簧组件扫描发现 - 功能)

但我无法让它发挥作用。 Spring-MVC-App - 有效。我已经注释了所有的@Controllers,所有的东西都是@Autowired自动。

但在Vaadin,我总是得到:

SCHWERWIEGEND: Servlet.service() for servlet [hello] in context with path [/pliste] threw exception [javax.servlet.ServletException: failed to acquire new instance of class net.d21.pliste.HelloWorld] with root cause
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [net.d21.pliste.HelloWorld] is defined: expected single bean but found 0: 

我认为我的基本问题是,如何将一般依赖注入2个不同的servlet? (就我而言,它是Vaadin和MVC,但我认为它是可替换的。)

1 个答案:

答案 0 :(得分:1)

典型的Spring webapp具有2级应用程序上下文层次结构:

  • ContextLoaderListener加载的根应用程序上下文,其默认配置文件为applicationContext.xml。此上下文包含可供所有servlet,过滤器等使用的公共bean。

  • 特定于Servlet的应用程序上下文。他们的默认配置位置是${serlvet-name}-servlet.xml。这些上下文包含特定于特定servlet的bean。

因此,在您的情况下,您需要在特定于servlet的上下文中声明applicationContext.xml中的公共bean和特定于servlet的bean(例如,Spring MVC的控制器)。

请注意,如果您使用<component-scan>,则需要避免在不同的上下文中使用不同的基本包或filtering them by annotations重复bean。