TestController.javaPrototype Bean nie zostanie autowired jak oczekiwano
@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() {
}
}
Jak widać, próbuję dowiedzieć się, czy nowy TestClass
został wstrzyknięto podczas wizyty "xxx/test". "new test class constructed."
wydrukowano tylko jeden raz (pierwszy raz uruchomiłem "xxx/test"), podczas gdy spodziewałem się, że wydrukowane zostanie ono jednakowo. Czy to oznacza, że obiekt @Autowired
może być tylko @Singleton
? Jak działa wtedy @Scope
?
EDIT:
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());
}
}
Próbowałem @Valerio Vaudi
rozwiązanie, zarejestrowaną jako Scope(scopeName = "request")
. Oto wynik trzy razem, kiedy odwiedzam "XXX/test"
(po raz pierwszy)
- nowa klasa Test skonstruowany.
- zerowy
(sekundy)
- zerowy
(trzeciej)
- zerowy
Nie rozumiem, dlaczego wynik jest zerowy, ponieważ nie rekonstruuje on nowego za każdym razem, gdy go używam.
Potem próbuje @Nikolay Rusev
roztwór @Scope("prototype")
:
(pierwszy)
- nowej budowy.
- nowy zbudowany.
- zerowy
(sekundy)
- nowej budowy.
- nowy zbudowany.
- zerowy
(trzeciej)
- nowej budowy.
- nowy zbudowany.
- zerowy
Jest to dość łatwe do zrozumienia, ponieważ za każdym razem go używać (TestClass), Wiosna automatycznej regeneracji nową instancję niego. Ale pierwsza scena wciąż nie mogę zrozumieć, ponieważ wydaje się zachować tylko jedną nową instancję dla każdego żądania.
Rzeczywistym celem jest: W każdym cyklu życia żądania, wymagany jest nowy testClass
(wymagany) i wymagany jest tylko jeden. W tej chwili wydaje się, że tylko rozwiązanie jest możliwe (o czym już wiedziałem), ale chcę tylko wiedzieć, czy można to zrobić automatycznie, używając @Component
+ @Scope
+ @Autowired
.
nie mogę dostać to, gdzie przychodzi trzeci NULL? opublikuj swój pełny kod TestClass ... –