You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:37:32