能否创建Spring单例的多个实例?多Bean配置为何未报错?
为什么定义多个同一类的Spring Bean不会报错?
其实这完全是正常现象,Spring从来没限制过同一个类可以定义多少个Bean——它的单例特性是针对每个Bean ID/名称的,而不是针对类本身的。
你配置里的三个Bean:
springsingleton1:默认单例,Spring会为这个ID创建一个唯一实例,整个容器里只有这一个对应springsingleton1的实例springsingleton2:原型作用域,每次获取这个Bean都会创建新实例springsingleton3:又是一个独立的单例Bean,和springsingleton1是完全分开的,容器会为这个ID单独维护另一个实例
这三个Bean只是共用了同一个类作为模板,但本身是Spring容器里不同的Bean对象,这种配置完全符合Spring的规则,所以自然不会抛出异常。
能不能创建Spring单例类的多个实例?
当然可以,常见的实现方式有几种:
- 像你这样,在配置中为同一个类定义多个单例Bean,每个Bean ID对应一个独立的单例实例
- 通过
@Scope("prototype")或者XML里的scope="prototype"配置,让Spring每次获取该Bean时都生成新实例 - 手动用
new关键字创建类的实例(不过这种实例不受Spring容器管理,不属于Spring Bean的范畴)
举个代码示例验证一下:
ApplicationContext context = new ClassPathXmlApplicationContext("your-spring-config.xml"); SpringSingleton bean1 = context.getBean("springsingleton1", SpringSingleton.class); SpringSingleton bean3 = context.getBean("springsingleton3", SpringSingleton.class); System.out.println(bean1 == bean3); // 输出false,说明是两个不同的实例
这里要划重点:Spring的"单例"指的是在一个Spring容器中,同一个Bean ID/名称对应的实例仅存在一个,这和设计模式里的单例模式(一个类全局只有一个实例)是完全不同的概念,可别搞混啦~
内容的提问来源于stack exchange,提问作者pjj
相关产品推荐
相关产品推荐

