我有一种情况,我需要在内存中保留一些使用春季启动的数据,这将不时更新它。我需要把它保存在一个映射中,但我有点困惑,如果我应该实现我自己的Singleton并使用组件注释。
我知道,默认情况下,对于注释组件的对象将使用单例,但在这种情况下,我必须使用从3个不同的类A, B和C.我的问题是,它会创建一个RepositoryComponent类A,另一个为B和另一个为C,每个将是单例?或者它只会为A创建一个,然后当B想要创建时,它会看到已经创建了一个,然后使用这个,然后为c创建一个。
否则我觉得我需要有我自己的单例实现
Class Repository {
Map<String, Config> db = new hashMap<>;
... singleton implementation
public String getConfig(string key) {
return db.get(key);
}
}
@Component
Class RepositoryComponent {
Map<String, Config> db = new hashMap<>;
public String getConfig(string key) {
return db.get(key);
}
}
@Component
Class A {
@Autowire
RepositoryComponent c;
public someMethod() {
Repository.getInstance().getConfig("key");
c.getConfig("key");
}
}
@Component
Class B {
@Autowire
RepositoryComponent c;
public someMethod() {
Repository.getInstance().getConfig("key");
c.getConfig("key");
}
}
@Component
Class C {
@Autowire
RepositoryComponent c;
public someMethod() {
Repository.getInstance().getConfig("key");
c.getConfig("key");
}
}
如果你用@Component注释了一个类,那么在同一个ApplicationContext中只会有一个该类型的bean。这是默认行为。
如果你用@Component和@Scope("prototype")注释一个类,Spring会在每次请求时创建一个新的实例。
只创建一个RepositoryComponent
bean,因为您使用的是@Component
,这意味着它的作用域是Singleton。因此,将在类a、B和C中注入的对象是完全相同的(对该bean名称的所有请求将返回相同的对象,该对象被缓存)。此外,对RepositoryComponent
bean的任何修改都将反映在对该bean的所有引用中。