es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo inyectar un servicio a la clase de fábrica / Java

Hola, me preguntaba qué pasaría si Addition() tuviera alguna variable. Digamos Addition(SomeService service). ¿Cómo se inyectaría en este ejemplo?

public class OperatorFactory {
    static Map<string, operation=""> operationMap = new HashMap<>();
    static {
        operationMap.put("add", new Addition());
        operationMap.put("divide", new Division());
        // más operadores
    }

    public static Optional<operation> getOperation(String operator) {
        return Optional.ofNullable(operationMap.get(operator));
    }
}

Lo tomé de aquí: enlace

Estoy tratando de reemplazar mi “ifología” por lo que se muestra arriba, pero cuando inyecto algo, siempre es nulo. Por ejemplo:

public class OperatorFactory {
    private static SomeService service;
    static Map<string, operation=""> operationMap = new HashMap<>();
    static {
        operationMap.put("add", new Addition(service));
        operationMap.put("divide", new Division());
        // más operadores
    }

    public static Optional<operation> getOperation(String operator) {
        return Optional.ofNullable(operationMap.get(operator));
    }
}

service siempre es nulo…</string,></string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para inyectar SomeService en Addition, la clase OperatorFactory necesita utilizar Inyección de Dependencias. Una forma de lograr esto es utilizando un framework como Spring.

    Primero, SomeService debe ser un bean gestionado por Spring, lo que significa que debe estar anotado con @Component o uno de sus estereotipos como @Service, @Repository, etc.

    Luego, la clase OperatorFactory también debe ser un bean gestionado por Spring. Puedes anotarlo con @Component u otro estereotipo adecuado.

    Finalmente, puedes utilizar las capacidades de inyección de dependencias de Spring para inyectar SomeService en Addition. Una forma de hacer esto es utilizando la inyección por constructor:

    public class OperatorFactory {
        private static SomeService service;
    
        static Map<string, operation=""> operationMap = new HashMap<>();
        static {
            operationMap.put("add", new Addition(service));
            operationMap.put("divide", new Division());
            // más operadores
        }
    
        public static Optional<operation> getOperation(String operator) {
            return Optional.ofNullable(operationMap.get(operator));
        }
    
        @Autowired
        public void setSomeService(SomeService service) {
            OperatorFactory.service = service;
        }
    }
    

    La anotación @Autowired marca el método setSomeService como una dependencia que debe ser inyectada por Spring. Cuando se llama a getOperation, devolverá un Optional que envuelve un objeto Addition con la dependencia SomeService ya inyectada.</string,>

Comments are closed.