ChatGPT解决这个技术问题 Extra ChatGPT

当用@Component注解一个类时,这是否意味着它是一个Spring Bean和Singleton?

作为 Spring 的新手,我有一个关于注释类的问题。当用 @Component 注释一个类时,这是否意味着这个类将是一个 Spring Bean,默认情况下是一个单例?


r
rogerdpack

是的,没错,@Component 是 Spring bean 和 Singleton。

如果该类属于服务层,您可能希望使用 @Service 对其进行注释

但请记住,为了检测这些注释,您需要将此行放在 applicationContext.xml 中:

<context:component-scan base-package="com.yourcompany" />

关于单例 - 默认情况下,spring bean 都在单例范围内。您唯一需要记住的是,您不应该将状态存储在字段变量中(它们应该只包含依赖项)。因此,您的应用程序将是线程安全的,并且您不会每次都需要一个新的 bean 实例。换句话说,你的 bean 是无状态的。


当使用@Component 和/或@Service 注释等时,意味着我正在创建单例,我不会遇到并发问题吗?对我的新手来说,这将产生一个在整个 ApplicationContext 中使用的 bean,因此并发用户将获得对单个 bean 的引用。还是我错过了什么?
@Marco如果你没有任何状态(实例变量不同于spring bean),那么不会发生并发问题。
您“想要”每次都需要一个新的 bean 实例,还是“不会”每次都需要一个新的 bean 实例?
@Bozho你是什么意思:“你不会每次都需要一个新的bean实例”?是否意味着 Spring 不必创建新实例,或者您作为开发人员不需要创建新实例?
C
Cristian Ramon-Cortes

默认情况下 - 是。

但是,您可以使用 @Scope 注释覆盖此行为。例如:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)