【问题标题】:Spring bean get initialized twice by xml and component-scanSpring bean 通过 xml 和 component-scan 初始化两次
【发布时间】:2016-07-13 03:29:30
【问题描述】:

我在春季创建了几个单例 bean。我在构造函数中添加了日志。我可以看到日志被打印了两次。

@Component
public class User{

        public User() {
         System.out.println(" Bean got initialized"+this);
       }  
        private Integer userid;

        private String username;

        //getter and setter

    }   

我已经在 XML 中定义了 bean 并配置了自动扫描。

<context:component-scan base-package="com.demo" />
<bean id="user" class="com.demo.User"/>

因为我已经在上下文 xml 和包扫描中初始化了 bean,所以 bean 被初始化了两次。从类中删除@Component 后,我​​只看到一次日志。

请确认我的理解是否正确?

【问题讨论】:

  • 注解是在 Spring 中引入的,因此我们不必显式地配置 xml 属性。当您使用@Component 时,这就是创建 User 类的 bean 的工作。所以当你使用@Component,并且还显式地创建一个bean“用户”时,它显然会创建两个实例

标签: java spring


【解决方案1】:

没错;组件扫描会拾取它,然后您显式创建另一个副本。

【讨论】:

    【解决方案2】:

    @Component 注解是在 Spring 2.5 中引入的,目的是通过使用类路径扫描来摆脱 XML bean 定义。如果该类使用@Component 注释,它将在类路径扫描中自动检测并创建一个实例(实例化)。由于@Component 完成了创建 bean 的工作,因此您不必在 XML 中声明 bean。所以删除 XML bean 声明。所以它不会创建重复的对象。

    注意:如果使用@Component 进行基于注解的bean 声明,则不需要像之前那样使用基于XML 的声明。如果您正在执行基于 XML 的 bean 声明,则不需要执行基于注释的 bean 声明。因此,请确保您仅声明这些选项之一。两者都没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多