【问题标题】:When annotating a class with @Component, does this mean it is a Spring Bean and Singleton?当用@Component注解一个类时,这是否意味着它是一个Spring Bean和Singleton?
【发布时间】:2011-05-06 06:16:47
【问题描述】:

对 Spring 还很陌生,我有一个关于注释类的问题。当使用 @Component 注释一个类时,这是否意味着这个类将是一个 Spring Bean,默认情况下是一个单例?

【问题讨论】:

    标签: spring annotations


    【解决方案1】:

    是的,没错,@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 不必创建新实例,或者您作为开发人员不需要创建新实例?
    【解决方案2】:

    默认情况下 - 是。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 2021-09-24
      • 2021-10-07
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多