Spring中@Component与@Scope定义原型Bean的差异及ServiceLocatorFactoryBean异常问题
为什么两种注解用法会有差异?
这个问题的核心是你误解了@Component注解中value参数的作用,它和@Scope注解的职责完全不同,咱们一步步拆解:
1. 你用@Component(value = ...)时到底发生了什么?
@Component注解的value参数是用来指定Bean的名称,而不是设置作用域!当你写:
@Component(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class Square { ... }
相当于你给这个Bean起了个名字叫"prototype"(因为ConfigurableBeanFactory.SCOPE_PROTOTYPE的字符串值就是"prototype"),但这个Bean的作用域还是Spring默认的单例(singleton),而且它的Bean名称根本不是你以为的"square"!
这就导致当你用ServiceLocatorFactoryBean去查找名为"square"的Bean时,Spring容器里根本没有这个名字的Bean,自然抛出NoSuchBeanDefinitionException。
2. @Scope注解才是设置作用域的正确方式
@Scope注解的唯一职责就是指定Bean的作用域,当你写:
@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class Square { ... }
此时:
- @Component没有指定value,Spring会默认用类名首字母小写作为Bean名称,也就是
"square" - @Scope把Bean的作用域设置为原型(prototype),每次获取都会生成新实例
所以ServiceLocatorFactoryBean能找到名为"square"的原型Bean,自然可以正常获取两个独立实例。
正确的组合写法
如果你想同时指定Bean名称和原型作用域,应该这样写:
@Component("square") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class Square { ... }
这样既明确了Bean的名称是"square",又设置了原型作用域,就能和预期一样工作了。
内容的提问来源于stack exchange,提问作者user3382677
相关产品推荐
相关产品推荐

