Java Struts 1:如何在不使用DI容器的情况下将依赖项注入操作类?

Java Struts 1:如何在不使用DI容器的情况下将依赖项注入操作类?,java,struts,struts-1,Java,Struts,Struts 1,一位客户雇佣我们维护一个非常旧的Struts 1 web应用程序。对于一个特性请求,我们需要实现一个依赖于服务类的新操作。原始代码库主要由意大利面代码组成,不使用依赖项注入容器之类的东西。我们正在慢慢地重构一切,以遵循现代标准,但现在我们必须适应原始代码库 如何在不引入依赖容器的情况下将服务注入到Action类中 package com.example.action; import com.example.service.ExampleService; import org.apache.s

一位客户雇佣我们维护一个非常旧的Struts 1 web应用程序。对于一个特性请求,我们需要实现一个依赖于服务类的新操作。原始代码库主要由意大利面代码组成,不使用依赖项注入容器之类的东西。我们正在慢慢地重构一切,以遵循现代标准,但现在我们必须适应原始代码库

如何在不引入依赖容器的情况下将服务注入到Action类中

package com.example.action;

import com.example.service.ExampleService;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public final class ExampleAction extends Action {
    private ExampleService exampleService;

    // This Action cannot be instantiated by Struts because of its dependency! :(
    public ExampleAction(ExampleService exampleService) {
        this.exampleService = exampleService;
    }

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        // ...

        exampleService.doSomething();

        // ...
    }
}


我找到了很多关于如何将Spring容器与Struts 1集成的信息,但是我找不到任何关于如何手动操作Struts的动作实例化过程的信息。我真的不想为了让新功能正常工作而进行更多的重构,所以我更喜欢一个快速而肮脏的解决方案,我只需干扰Struter的动作实例化过程就可以手动注入我的服务。

动作创建是在(IIRC)请求处理器中处理的,所以你可能可以在那里做点什么,但是没有一个统一的机制来确定需要注入什么,以及它将如何像您当前的代码那样像意大利面条一样结束——您最好集成一个旧版本的Spring。除非您有特定的理由动态注入服务,否则只需在操作中实例化它;您的单元测试仍然可以注入所需的任何内容。但是,尝试在不处理基本问题的情况下更新S1应用程序将产生比消除更多的工作。感谢您的输入,我最终集成了老式的PicoContainer,因为它几乎是开箱即用的,只需要很少的更改。