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.

Inyectar un bean en una clase instanciada manualmente en Spring.

Tengo algunas clases de dominio que estoy utilizando. Existe un requisito de registro en ellas, pero no parece que Spring permita inyectar un bean en un objeto instanciado manualmente. No quiero tener que pasar el registrador como parámetro al constructor porque este registrador es un bean que estoy inyectando automáticamente en la mayoría de mis clases. Se ve un poco así:

public class MainClass {
    private Logger logger;
    public MainClass(Logger logger) {
        this.logger = logger;
    }
    public void doThing() {
        //..hacer cosas
        DomainClass domainObject = new DomainClass(//parámetros);
    }
}

public class DomainClass {
    //montón de campos

    //campo que quiero inyectar automáticamente
    private Logger logger;
}

@Component
public class Logger {
    //cosas
}

¿Existe alguna forma de lograr esto sin pasar el registrador como parámetro?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de lograr esto sin pasar el registrador como parámetro. Puedes hacer uso de la interfaz ApplicationContextAware de Spring. Al implementar la interfaz, el bean puede tener conocimiento del ApplicationContext en el que se ejecuta y puede usarlo para obtener referencias a otros beans. Así es como puedes modificar la clase DomainClass para lograr esto:

    public class DomainClass implements ApplicationContextAware {
    
        //montón de campos
    
        //campo que quiero autowire
        private Logger logger;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.logger = applicationContext.getBean(Logger.class);
        }
    }
    

    Esto permite que el bean logger sea inyectado en DomainClass sin tener que pasarlo como parámetro del constructor. Cuando DomainClass es creado por MainClass, el campo logger será configurado automáticamente por Spring, siempre y cuando MainClass también sea un bean de Spring administrado por el ApplicationContext.

Comments are closed.