2016-10-24 8 views
0

MyConfig(Spring Configurationファイル)がBeanのコンストラクタで参照されているプログラムの1つが、 MyConfig。 この種の設定についてはわかりません。私はこの種のコードで循環参照を見ることができますが、うまくいきますが、その流れを理解することはできません。どのように動作しています。以下は、そのコードのレプリカである - ここでBeanコンストラクタ内でJavaのコンフィグレーションリファレンスが構築されたクラスの他のBeanを取得するために

@Configuration 
public class MyConfig { 

    @Bean(name="a") 
    @Scope("prototype") 
    public A getA() { 
     return new A(); 
    } 

    @Bean(name="b") 
    @Scope("prototype") 
    public B getB() { 
     return new B(); 
    } 

    @Bean(name="c") 
    @Scope("prototype") 
    public C getC() { 
     return new C(); 
    } 

    @Bean(name="queueListener") 
    @Scope("singleton") 
    public Queue getQueue() { 
     return new Queue(MyConfig config); 
    } 

} 

は私のキュークラスである -

public class Queue implements MessageListener{ 

    private MyConfig config; 

    public Q(MyConfig config) { 
     this.config = config; 
    } 

    @Override 
    public void onMessage() { 
     createC(); 
    } 

    public void createC() { 
     C cObj = config.getC(); 
     cObj.setConfig(config); 
     cObj.performTask(); 
    } 
} 

クラス "C" はthis-

public class C{ 

    private transient MyConfig config; 
    private MyConfig config; 

    public C() {  
    } 

    public void setConfig(MyConfig config) { 
     this.config = config; 
    } 

    public MyConfig getConfig() { 
     return config; 
    } 

    public void performTask() {  
     A a = config.getA(); // Is it right way to get bean? 
     B b = config.getB(); 
    } 

} 

のように見えているので、私の質問は、ということです別の豆に豆を入れるのは正しい方法ですか? 戻りオブジェクトは実際にSpring Beanオブジェクトか単純なJavaクラスオブジェクトですか?

上記のコードで循環参照を参照できます。MyConfig内でQueueクラスのインスタンスが作成されるときに、MyConfigのインスタンス/参照が使用されます。 これは循環参照を作成しますか? My Architectは、Queueとクラス "C"の両方でアプリケーションコンテキストを自動配線する代わりに、上記のアプローチを提案しました。建築家によると、文脈は非常に重く、ベストプラクティスではありません。

Bean Queueの作成時に実行サイクルまたは呼び出し階層はどのようになりますか? 上記のコードの動作を理解することは非常に役に立ちます。

答えて

0

Spring Boot @Autowired creating instances on a runtime の例を参照してくださいあなたは本当に具体的なBeanに設定インスタンスを注入する悪い考えですシングルトンとプロトタイプ正しい方法

+0

リンクが奨励されているのが、あなたの仲間のユーザーが何もいくつかのアイデアを持っていますので、リンク周りのコンテキストを追加してくださいそれはなぜそこにあるのですか?ターゲットサイトに到達できない場合や、永続的にオフラインになる場合は、常に重要なリンクの最も関連性の高い部分を引用してください。 – segarci

0

を使用する方法を見ることができます。あなたのコードを複雑にし、テストのために不便になる。なぜなら、Queueインスタンスをテストするためには、どうにか全体の設定を模擬する必要があるからです。

あなたはここに記載された技術を使用することができますシングルトンにプロトタイプBeanを注入する場合:外部リソースへ Howto generate prototype objects with in a singleton bean using spring java configurations

関連する問題