Struts 1: Как внедрить зависимости в классы Action без использования контейнера DI? - PullRequest
0 голосов
/ 19 сентября 2019

Клиент нанял нас для поддержки действительно старого веб-приложения Struts 1.Для запроса функции нам нужно реализовать новое действие, которое зависит от класса Service.Исходная кодовая база состоит в основном из спагетти-кода и не использует ничего, кроме контейнера для внедрения зависимостей.Мы постепенно реорганизуем все, чтобы соответствовать современным стандартам, но сейчас нам нужно обойтись с исходной базой кода.

Как внедрить Сервис в мой класс 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, но я не смог найти ничего о том, как управлять процессом создания экземпляров Action в Strut вручную.Я действительно не хочу проводить рефакторинг больше, чем нужно, чтобы новая функция работала, поэтому я бы предпочел быстрое и грязное решение, в котором я просто вмешиваюсь в процесс создания экземпляров Action Strut, чтобы внедрить мою службу вручную.

...