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() {
}
}
Как вы можете видеть, я пытаюсь выяснить, был ли введен новый TestClass
при посещении "xxx/test" . "new test class constructed."
был напечатан только один раз (первый раз я запускал "xxx/test" ), в то время как я ожидал, что он будет напечатан одинаково. Значит ли это, что объект @Autowired
может быть @Singleton
? Как работает @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());
}
}
Я попробовал решение @Valerio Vaudi
, зарегистрированное как Scope(scopeName = "request")
. Вот три результата, когда я посещаю "xxx/test"
(первый раз)
- построен новый тестовый класс.
- NULL
(второй)
- NULL
(третий)
- NULL
Я не понимаю, почему результат null, так как он не восстанавливает новый каждый раз, когда я его использую.
Затем я попробовал @Nikolay Rusev
solution @Scope("prototype")
:
(первый)
- новый построенный.
- новый построенный.
- NULL
(второй)
- новый построенный.
- новый построенный.
- NULL
(третий)
- новый построенный.
- новый построенный.
- NULL
Это довольно легко понять, поскольку каждый раз, когда я его использую (TestClass), Spring автоматически восстанавливает новый экземпляр. Но первая сцена, которую я до сих пор не могу понять, поскольку она, похоже, сохраняет только один новый экземпляр для каждого запроса.
Реальная цель:. В каждом жизненном цикле запроса требуется новый TestClass
(при необходимости), и требуется только одно. На данный момент кажется возможным только решение ApplicationContext
(что я уже знал), но я просто хочу знать, можно ли это сделать автоматически, используя @Component
+ @Scope
+ @Autowired
.