用@Component注解一个类,是否代表它是一个Spring Bean和Singleton?

问题描述 投票:0回答:3

作为 Spring 的新手,我有一个关于注释类的问题。当用

@Component
注释一个类时,这是否意味着这个类将是一个 Spring Bean,默认情况下是一个单例?

spring annotations
3个回答
172
投票

对,没错,

@Component
是一个Spring bean和一个Singleton。

如果该类属于服务层,您可能需要用

@Service
来注释它

但是请记住,为了检测到这些注释,您需要将此行放在

applicationContext.xml
:

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

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


38
投票

默认 - 是。

但是,您可以使用

@Scope
注释覆盖此行为。例如:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)


0
投票

以上答案不准确

是的,在设计模式中,

@Component
的行为就像单例模式所暗示的那样。

但是,在 JavaEE 术语中,

@Singleton
@ApplicationScoped
bean 是有区别的。在 Spring 中,
@Service
@Component
的行为更像传统的
@ApplicationScoped
bean,在同一 ServletContext 中运行的多个基于 servlet 的应用程序之间进行代理和共享,而单例作用域 beans 仅作用于单个应用程序上下文.

如果你用

@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
注释 Bean,它将在服务器启动时实例化,而常规的
@Component
@Service
将被代理并休眠直到被访问。

© www.soinside.com 2019 - 2024. All rights reserved.