【发布时间】:2019-04-16 13:38:36
【问题描述】:
Spring 是否为不同的 bean 创建相同类型的构造函数参数的新实例?
例如,我有两个 REST 控制器:
第一:
@RestController
@RequestMapping ("/getHwidData")
public class GetHwidDataController {
private final ApiKeysDatabase apiKeysDb;
private final BanwareDatabase banwareDb;
@Autowired
public GetHwidDataController(ApiKeysDatabase apiKeysDb, BanwareDatabase banwareDb) {
this.apiKeysDb = apiKeysDb;
this.banwareDb = banwareDb;
}
}
第二:
@RestController
@RequestMapping ("/setHwidData")
public class SetHwidDataController {
private final ApiKeysDatabase apiKeysDb;
private final BanwareDatabase banwareDb;
@Autowired
public SetHwidDataController(ApiKeysDatabase apiKeysDb, BanwareDatabase banwareDb) {
this.apiKeysDb = apiKeysDb;
this.banwareDb = banwareDb;
}
}
如您所见,两个控制器的构造函数都是@Autowired,并且都接受相同的对象类型:ApiKeysDatabase 和BanwareDatabase。
我在这些 *Database 类中有一些缓存和其他与实例相关的东西,所以我想知道:当创建上述两个 REST 控制器时,它们的 apiKeysDb 和 @987654329 @字段分别相等(分别持有ApiKeysDatabase和BanwareDatabase对象的相同实例)?也就是说,
GetHwidDataController ctrlOne = ...
SetHwidDataController ctrlTwo = ...
assertTrue ctrlOne.apiKeysDb == ctrlTwo.apiKeysDb
&& ctrlOne.banwareDb == ctrlTwo.banwareDb
【问题讨论】:
-
取决于 bean。你可以注释每一个有不同的范围:原型、单例、请求、会话、全局会话:docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
-
缓存和实例相关的东西是一个糟糕的主意。这些应该是共享单例。
标签: java spring spring-boot autowired