2016-07-13 10 views
0

私は春にシングルトンBeanをほとんど作成していません。私はコンストラクタ内部にログを追加しました。ログが2回印刷されているのがわかりました。Spring Beanはxmlとコンポーネントスキャンで2回初期化されます

@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は2回初期化されています。クラスから@Componentを削除した後、ログを1回だけ表示しています。

私の理解が正しいかどうかを確認してください。

+0

アノテーションはSpringで導入されたので、xmlプロパティを完全に設定する必要はありません。 @Componentを使用しているときは、UserクラスのBeanを作成する作業をしています。したがって、@ Componentを使用して、明示的にBean "user"を作成すると、明らかに2つのインスタンスが作成されます –

答えて

0

これは間違いありません。コンポーネントスキャンがそれを取得し、明示的に別のコピーを作成します。

0

@Component注釈は、クラスパススキャンを使用してXML Bean定義を取り除くために、Spring 2.5で導入されました。クラスに@Componentと注釈が付けられている場合、クラスパスのスキャンで自動的に検出され、インスタンスが作成(インスタンス化)されます。 @ComponentはBeanを作成するためのジョブを実行するので、XMLでBeanを宣言する必要はありません。そのため、XML Beanの宣言を削除してください。重複したオブジェクトは作成されません。

注:@Componentを使用してアノテーションベースのBean宣言を行う場合、XMLベースの宣言を使用する必要はありません。 XMLベースのBean宣言を行っている場合は、アノテーションベースのBean宣言を行う必要はありません。したがって、これらのオプションのうちの1つだけを宣言するようにしてください。両方ともではありません。

関連する問題