我们有一个遗留的Web应用程序(不是基于Spring的),并且正在寻找最佳实践,以便将一些较新的Spring配置(线程安全)服务bean自动装配到几个传统servlet中的实例变量中。将每个servlet重写为Spring MVC都超出了范围。为了测试性,我们不希望Servlet中的任何Spring特定bean查找代码按名称或类似方式查找bean。
请注意,我们不关心特定于Web的bean范围,例如会话或请求;所有服务都是单身范围。
下面显示了相关的代码段
MyServlet extends LegacyServletSuperclass
{
private MyThreadSafeServiceBean wantThisToBeAutowiredBySpring;
....
}
答案 0 :(得分:2)
您可以将@Configurable
与<context:load-time-weaver />
结合使用,并在servlet中使用@Autowired
。这允许Spring没有实例化的类由spring处理。
您也可以使用另一种方法 - 在servlet的init(..)
方法中:
ApplicationContext ctx =
WebApplicationContextUtils.getWebApplicationContext(servletContext);
if (ctx != null) {
ctx.getAutowireCapableBeanFactory().autowireBean(this);
}
这将设置所有spring依赖项(使用@Autowired
/ @Resource
)。如果在spring中定义服务类,它将起作用,我认为是这种情况。
从可测试性的角度来看 - 如果没有Web应用程序上下文,则不会发生任何事情,您可以手动设置依赖项。如果需要,您还可以模拟应用程序上下文,具体取决于您测试servlet的方式