2012-08-10 23 views
10

Spring 3(@Component@Configuration)の2つの注釈が出ました。 私は少し混乱しています。ここで
が、私はこの「文脈:コンポーネント」入れ@ComponentSpring 3の@Componentと@Configurationの違い

について読んだことあるBean構成ファイル内に、それは意味し、 は春で、自動スキャン機能を有効に。ベースパッケージは、あなたのコンポーネントが格納されている を示し、Springはこのフォルダをスキャンし、 (@Componentでアノテーションされた)Beanを見つけて Springコンテナに登録します。

は、だから私は@Controller春の構成XMLファイル

答えて

8

@Configurationでそれらを宣言する必要がなく、私の豆を登録します、その後場合@Configurationの使用が何であるか疑問に思っては、Javaベースの構成の心臓部でありますこれはXMLベースの設定に代わるものです。

SO 2次のスニペットが同一である:

<beans ...> 
    <context:component-scan base-package="my.base.package"/> 
    ... other configuration ... 
</beans> 

と:春はmy.base.packageに走査し、以下@Component又は他の注釈のいずれかで注釈クラスのであろういずれの場合においても

@Configuration 
@ComponentScan(basePackages = "my.base.package") 
public class RootConfig { 
    ... other configuration ... 
} 

@Serviceなどの@Componentでメタ注釈されています。ブックプロ春の統合

@Configurationクラスから

7

@Beanでアノテート方法は、工場出荷時の豆に使用されていることを除いて、普通の@Componentsクラスのようなものです。 @Bean注釈付きメソッドを持つ@Componentは、スコープが尊重しないされていないと@Beanメソッドが再起動されます(再生には、キャッシング)、そう@Configurationが、それはここではCGLIB

+6

「Aは、そのBを除いてBのようなものであることに注意すると、Aも同じように動作していることX.注のように振る舞いますバツ。"すばらしいです。 –

0

を必要としているにもかかわらず、優先されることを除いて、同じように動作することに注意してくださいフル例との違い: - ここ

//@Configuration or @Component 
public static class Config { 
    @Bean 
    public A a() { 
     return new A(); 
    } 
    //**please see a() method called inside b() method** 
    @Bean 
    public B b() { 
     return new B(a()); 
    } 
} 

1)Configクラスは@Configurationで注釈場合、()メソッドおよびB()メソッドよりも、両方が後と呼ぶことにします。

2)ここで()メソッドよりも@Componentで注釈さConfigクラスは、が、B()メソッドに一度と呼ぶことにする場合は、二回呼び出されます。

(2)の問題:@compenentアノテーションに問題があることがわかりました。 この2番目の設定(2)は完全に間違っています。なぜなら、スプリングはAのシングルトンBeanを作成しますが、Bはスプリングコンテキストコントロールから外れたAの別のインスタンスを取得するからです。

解決策: - 私はConfigクラス内で@componentアノテーションを使用して@autowiredアノテーションを使用できます。

@Component 
public static class Config { 
    @Autowired 
    A a; 

    @Bean 
    public A a() { 
     return new A(); 
    } 

    @Bean 
    public B b() { 
     return new B(a); 
    } 
} 
+1

私はbが1回、2回(2回 –

0

これは古いですが、一例で、JavaBoyそしてビジェイの回答に起草が:

@Configuration 
public class JavaConfig { 
    @Bean 
    public A getA() { 
     return new A(); 
    } 
} 

@Component 
@ComponentScan(basePackages="spring.example") 
public class Main() { 
    @Bean 
    public B getB() { 
     return new B(); 
    } 
    @Autowired 
    JavaConfig config; 

    public static void main(String[]a) { 
     Main m = new AnnotationConfigApplicationContext(Main.class) 
      .getBean(Main.class); 
     /* Different bean returned everytime on calling Main.getB() */ 
     System.out.println(m.getB()); 
     System.out.println(m.getB()); 
     /* Same bean returned everytime on calling JavaConfig.getA() */ 
     System.out.println(m.config.getA()); 
     System.out.println(m.config.getA()); 
    } 
} 
関連する問題