Class 单例或组件。它必须从不同的地方调用
Class Singleton or Component. It must be called from different places
我有一种情况需要使用 spring 引导在内存中保存一些数据,这将不时更新。我需要将它保存在地图中,但如果我应该实现自己的 Singleton 并使用组件注释,我会有点困惑。
我知道默认情况下,对于注释组件,对象将使用 Singleton,但在这种情况下,我必须使用 3 个不同的 classess A、B 和 C。我的问题是,它会创建一个class A 的 RepositoryComponent,B 的另一个,C 的另一个,每个都是单例的?或者它只会为 A 创建一个,然后当 B 想要创建时,它会看到已经创建了一个,并将使用那个和 C 相同的那个。
否则我觉得我需要有自己的Singleton实现
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");
}
}
只会创建一个 RepositoryComponent
bean,因为您使用的是 @Component
,这意味着它的作用域是 Singleton。因此,将在 Class A、B 和 C 中注入的那个完全相同(对该 bean 名称的所有请求都将 return 缓存的相同对象)。
此外,对 RepositoryComponent
bean 的任何修改都将反映在对该 bean 的所有引用中。
如果您用@Component 注释了一个class,在同一个ApplicationContext 中将只有一个该类型的bean。这是默认行为。
如果您使用@Component 和@Scope("prototype") 注释了一个class,Spring 每次请求时都会创建一个新实例。
我有一种情况需要使用 spring 引导在内存中保存一些数据,这将不时更新。我需要将它保存在地图中,但如果我应该实现自己的 Singleton 并使用组件注释,我会有点困惑。
我知道默认情况下,对于注释组件,对象将使用 Singleton,但在这种情况下,我必须使用 3 个不同的 classess A、B 和 C。我的问题是,它会创建一个class A 的 RepositoryComponent,B 的另一个,C 的另一个,每个都是单例的?或者它只会为 A 创建一个,然后当 B 想要创建时,它会看到已经创建了一个,并将使用那个和 C 相同的那个。
否则我觉得我需要有自己的Singleton实现
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");
}
}
只会创建一个 RepositoryComponent
bean,因为您使用的是 @Component
,这意味着它的作用域是 Singleton。因此,将在 Class A、B 和 C 中注入的那个完全相同(对该 bean 名称的所有请求都将 return 缓存的相同对象)。
此外,对 RepositoryComponent
bean 的任何修改都将反映在对该 bean 的所有引用中。
如果您用@Component 注释了一个class,在同一个ApplicationContext 中将只有一个该类型的bean。这是默认行为。
如果您使用@Component 和@Scope("prototype") 注释了一个class,Spring 每次请求时都会创建一个新实例。