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 每次请求时都会创建一个新实例。