O protótipo Bean não é conectado automaticamente conforme o esperado
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 você pode ver, estou tentando descobrir se um novoTestClass
foi injetado quando visita "xxx / test"."new test class constructed."
foi impresso apenas uma vez (pela primeira vez, iniciei "xxx / test") enquanto esperava que fosse impresso igualmente. Isso significa@Autowired
objeto só pode ser@Singleton
? Como@Scope
trabalhar então?
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());
}
}
eu tentei@Valerio Vaudi
solução, registrada comoScope(scopeName = "request")
. Aqui está o resultado de três vezes quando visito "xxx / test"
(primeira vez)
nova classe de teste construída.nulo(segundo)
nulo(terceiro)
nuloNão entendo por que o resultado é nulo, pois ele não reconstrói um novo cada vez que o uso.
Então eu tentei@Nikolay Rusev
solução@Scope("prototype")
:
(primeiro)
novo construído.novo construído.nulo(segundo)
novo construído.novo construído.nulo(terceiro)
novo construído.novo construído.nuloIsso é fácil de entender, pois cada vez que eu o uso (TestClass), o Spring gera novamente uma nova instância automaticamente. Mas a primeira cena que ainda não consigo entender, pois parece reter apenas uma nova instância para cada solicitação.
O verdadeiro objetivo é: Em cada ciclo de vida da solicitação, um novotestClass
é necessário (se necessário) e apenas um é necessário. Neste momento parece apenasApplicationContext
solução é viável (o que eu já sabia), mas eu só quero saber se isso pode ser feito automaticamente usando@Component
+ @Scope
+ @Autowired
.