测试控制器.java
@RestController
public class TestController {
@Autowired
private TestClass testClass;
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void testThread(HttpServletResponse response) throws Exception {
testClass.doSomething();
}
}
测试类.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
工作呢?
编辑:
测试控制器.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”时的三次结果
(第一次)
- 构建了新的测试类。
- 无效的
(第二)
- 无效的
(第三)
- 无效的
我不明白为什么结果为空,因为每次我使用它时它都不会重建一个新的。
然后我尝试了@Nikolay Rusev
解决方案@Scope("prototype")
:
(第一的)
- 新建的。
- 新建的。
- 无效的
(第二)
- 新建的。
- 新建的。
- 无效的
(第三)
- 新建的。
- 新建的。
- 无效的
这很容易理解,因为每次我使用它(TestClass)时,Spring 都会自动重新生成它的新实例。但是我仍然无法理解第一个场景,因为它似乎为每个请求只保留一个新实例。
真正的目的是:在每个请求生命周期中,需要一个新testClass
的(如果需要),并且只需要一个。目前看来只有解决方案是可行的(我已经知道了)ApplicationContext
,但我只想知道这是否可以通过使用@Component
++自动完成。@Scope
@Autowired