【问题标题】:How to make a legacy webapp spring aware at the container level for bean autowire into Servlets?如何在容器级别使传统的 webapp spring 感知 bean 自动装配到 Servlet 中?
【发布时间】:2011-01-28 15:10:57
【问题描述】:

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

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

下面是相关代码sn-p

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

}

【问题讨论】:

    标签: spring servlets web-applications autowired


    【解决方案1】:

    您可以将@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 的方式.

    【讨论】:

    • 谢谢,我们会调查这些。如果没有其他想法进来并成功实施,我会接受答案
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 2012-08-11
    • 2022-08-20
    • 2020-11-19
    • 1970-01-01
    • 2022-09-23
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多