【问题标题】:Does Spring @Autowired create new instance of parameters for each bean? [duplicate]Spring @Autowired 是否为每个 bean 创建新的参数实例? [复制]
【发布时间】: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,并且都接受相同的对象类型:ApiKeysDatabaseBanwareDatabase

我在这些 *Database 类中有一些缓存和其他与实例相关的东西,所以我想知道:当创建上述两个 REST 控制器时,它们的 apiKeysDb 和 @987654329 @字段分别相等(分别持有ApiKeysDatabaseBanwareDatabase对象的相同实例)?也就是说,

GetHwidDataController ctrlOne = ...
SetHwidDataController ctrlTwo = ...

assertTrue ctrlOne.apiKeysDb == ctrlTwo.apiKeysDb 
        && ctrlOne.banwareDb == ctrlTwo.banwareDb

【问题讨论】:

标签: java spring spring-boot autowired


【解决方案1】:

这取决于 bean 的类型,默认范围是单例,所以在这种情况下,不,它不会创建新实例,但会使用相同的实例。

您可以使用 @Scope 注释更改 bean 的范围。

【讨论】:

    猜你喜欢
    • 2018-09-30
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2018-02-02
    • 2015-05-22
    相关资源
    最近更新 更多