Prototype Bean no se cablea automáticamente como se esperaba
TestController.java
@RestController
public class TestController {
@Autowired
private TestClass testClass;
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void testThread(HttpServletResponse response) throws Exception {
testClass.doSomething();
}
}
TestClass.java
@Component
@Scope("prototype")
public class TestClass {
public TestClass() {
System.out.println("new test class constructed.");
}
public void doSomething() {
}
}
Como puede ver, estoy tratando de averiguar si un nuevoTestClass
se inyectó cuando visitó "xxx / test"."new test class constructed."
se imprimió solo una vez (la primera vez que activé "xxx / test") mientras esperaba que se imprimiera por igual. ¿Eso es malo?@Autowired
objeto solo puede ser@Singleton
? Cómo@Scope
trabajo entonces?
EDITAR:
TestController.java
@RestController
public class TestController {
@Autowired
private TestClass testClass;
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void testThread(HttpServletResponse response) throws Exception {
testClass.setProperty("hello");
System.out.println(testClass.getProperty());
}
}
Lo intenté@Valerio Vaudi
solución, registrada comoScope(scopeName = "request")
. Aquí está el resultado de tres veces cuando visito "xxx / test"
(primera vez)
nueva clase de prueba construida.nulo(segundo)
nulo(tercero)
nuloNo entiendo por qué el resultado es nulo, ya que no reconstruye uno nuevo cada vez que lo uso.
Entonces intenté@Nikolay Rusev
solución@Scope("prototype")
:
(primero)
uno nuevo construido.uno nuevo construido.nulo(segundo)
uno nuevo construido.uno nuevo construido.nulo(tercero)
uno nuevo construido.uno nuevo construido.nuloEsto es bastante fácil de entender ya que cada vez que lo uso (TestClass), Spring regenera automáticamente una nueva instancia. Pero todavía no puedo entender la primera escena, ya que parece retener solo una nueva instancia para cada solicitud.
El verdadero propósito es: En cada ciclo de vida de solicitud, un nuevotestClass
es obligatorio (si es necesario) y solo se requiere uno. En este momento parece soloApplicationContext
la solución es factible (lo cual ya sabía), pero solo quiero saber si esto podría hacerse automáticamente usando@Component
+ @Scope
+ @Autowired
.