我想知道是否可以将临时数据存储在的class属性中Controller。我对并发调用感到怀疑。例如,让我们考虑以下代码:
Controller
@Controller public class TestController { @Autowired private TestService testService; @Autowired private OtherService otherService; private final HashMap<Integer, Test> testMap = new HashMap<Integer, Test>(); @RequestMapping(value = "test") @ResponseBody public List<Test> test() { List<Test> list = new ArrayList<Test>(); for (final OtherTest otherTest : otherService.getAll()) { Integer key = otherTest.getId(); final Test t; if(testMap.containsKey(key)) { t = testMap.get(key); } else { t = testService.getByOtherTestId(key); } list.add(t); } } }
我知道Controllers是Beans,而且我知道Beans是Singleton,所以:
Controllers
Beans
Singleton
如果两个用户同时调用该test方法会怎样?他们每个人都读/写相同的testMap对象吗?当testMap对象失去作用范围并会重新实例化?
test
testMap
谢谢
是的,这两个请求将操纵同一testMap对象。如果要Map为每个请求创建一个新请求,则可以在一个配置类中为其创建一个bean:
Map
@Bean @RequestScope // or @Scope("request") public Map<Integer, Test> testMap() { return new HashMap<>(); }
并将其自动连接到控制器中:
@Autowired private Map<Integer, Test> testMap;