3

我们有一个遗留的 Web 应用程序(不是基于 Spring 的),并且正在寻找最佳实践来将一些较新的 Spring 配置(线程安全)服务 bean 自动装配到几个遗留 servlet 中的实例变量中。将每个 servlet 重写为 Spring MVC 超出了范围。为了可测试性,我们不希望 Servlet 中的任何 Spring 特定的 bean 查找代码按名称或类似名称查找 bean。

请注意,我们不关心特定于 Web 的 bean 范围,例如会话或请求;所有服务都是单例范围。

下面显示了相关的代码片段

MyServlet extends LegacyServletSuperclass
{
   private MyThreadSafeServiceBean wantThisToBeAutowiredBySpring;
   ....

}
4

1 回答 1

2

您可以@Configurable与 , 结合使用<context:load-time-weaver />,并@Autowired在您的 servlet 中使用。这允许由 spring 处理未由 spring 实例化的类。

您也可以使用另一种方法 - 在init(..)您的 servlet 方法中:

ApplicationContext ctx = 
    WebApplicationContextUtils.getWebApplicationContext(servletContext);
if (ctx != null) {
    ctx.getAutowireCapableBeanFactory().autowireBean(this);
}

这将设置所有 spring 依赖项(使用@Autowired/@Resource的地方)。如果服务类是在 spring 中定义的,它将起作用,我假设是这种情况。

从可测试性的角度来看 - 如果没有 Web 应用程序上下文,则不会发生任何事情,您可以手动设置依赖项。如果需要,您还可以模拟应用程序上下文,具体取决于您测试 servlet 的方式。

于 2010-03-17T15:15:20.800 回答