Pregunta

Me gustaría saber si es posible usar Spring para resolver las dependencias de un objeto creado manualmente en mi programa. Echa un vistazo a la siguiente clase:

public class TestClass {

   private MyDependency md;

   public TestClass() {
   }

   ...

   public void methodThaUsesMyDependency() {
      ...
      md.someMethod();
      ...
   }

}

Este TestClass no es un bean de primavera, pero necesita MyDependency, que es un bean de primavera. ¿Hay alguna manera de inyectar esta dependencia a través de Spring, incluso si hago una instancia de TestClass con un nuevo operador dentro de mi código?

Gracias

¿Fue útil?

Solución

Editar: El método que describo en mi respuesta original a continuación es la forma general de lograr una DI externa al contenedor. Para su necesidad específica - pruebas - estoy de acuerdo con la respuesta de DJ. Es mucho más apropiado usar el soporte de prueba de Spring, por ejemplo:

@Test
@ContextConfiguration(locations = { "classpath*:**/applicationContext.xml" })
public class MyTest extends AbstractTestNGSpringContextTests {

    @Resource
    private MyDependency md;

    @Test
    public void myTest() {
            ...

Si bien el ejemplo anterior es una prueba de TestNG, también se explica el soporte de Junit en 8.3.7.2. Gestión de contexto y almacenamiento en caché .


Enfoque general: Anote su clase con @Configurable y utilice el tiempo de carga de AspectJ o el tiempo de compilación. Consulte 6.8.1 en la documentación de Spring en AOP para más detalles.

Luego puede anotar sus variables de instancia con @Resource o @Autowired . Aunque logran el mismo objetivo de inyección de dependencias, recomiendo usar @Resource ya que es un estándar de Java en lugar de un específico de Spring.

Por último, recuerde considerar el uso de la palabra clave transitoria (o @Transient para JPA) si planea serializar o conservar los objetos en el futuro. Es probable que no desee serializar las referencias a su repositorio, servicio o componente Beans DI.

Otros consejos

Consulte autowire () en el método AutowireCapableBeanFactory . Si usa un ClasspathXmlApplicationContext , puede obtener la fábrica con getAutowireCapableBeanFactory ()

Para obtener ApplicationContext, necesitaría usar un singleton estático u otro repositorio central, como JNDI o un contenedor Servlet. Consulte DefaultLocatorFactory sobre cómo obtener una instancia de ApplicationContext.

Si lo que necesita es para propósitos de prueba, Spring tiene un buen soporte para el escenario que describió anteriormente.

Consulte Sección de referencia del manual de Spring sobre pruebas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top