私たちは春ブーツに適用範囲PROTYPEのプロキシモードを使用する場合、プロトタイプBeanのオブジェクトがガベージコレクションを取得しますされている場合

prnjn:

プロトタイプビーンのgetゴミが収集されますときに我々は春のブートにクラスのスコープのプロトタイプにプロキシモードを使用する場合、それは春によって処理されますか?

MyClassBの目的は、生ゴミは、例の下で収集されますか、それはメモリリークにつながっているとき?

 @Service
    public class MyClassA {

        @Autowired
        private MyClassB myClassB;

        public String findMydata(String input) {

            String myData = myClassB.getSomeData(input);    
            return myData;
        }
    }

以下、上記のクラスによって使用されるスコーププロトタイプとクラスであります

@Service
@Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE,
       proxyMode=ScopedProxyMode.TARGET_CLASS)
public class MyClassB {

        MyPojoClassA mypojoA = null;
        MyPojoClassB mypojoB = null;     

    @Autowired
    private MyClassC myClassC;

    @Autowired
    private myClassD myClassD;

    public String getSomeData(String input) {
        String SomeData = "";

            myMethodA(input);

            // makes call to external service for data  
        SomeData = myClassC.getSomeData(mypojoA.getSomething());
        myMethodB(mypojoA.getSomeOthervalue());

        if(SomeData.isBlank()){
                // retrieve the data from database.
            SomeData = myClassD.getSomeData(mypojoB.getSomething());
        }
        return SomeData;
    }

        private void myMethodA(String input){
           // process and set values in mypojoA
        }
        private void myMethodB(String input){
           // process and set values in mypojoB
        }
}

用法及びmyPojoAとmyPojoBの異なるフィールドに値を割り当てる方法はgetSomeData内部異なるプライベートメソッドを呼び出すことにより、複数回行われます。ここでのサンプルコードでは、私は簡単にするためにこれらの呼び出しをしたが、使用されている2つのクラスの2つのインスタンス・レベルの参照変数があることを示すために持っていませんでした。

ケンちゃん

オブジェクトが他のオブジェクトによって使用/参照されない場合は、GCの対象となります。出典は、セクションの記述ガベージコレクションを参照してください)

あなたの例では、あなたがプロトタイプ化注入しているがMyClassBシングルトンにMyClassA、MyClassAは常に同じにアクセスできますMyClassBインスタンスは、注射主な理由MyClassBには、MyClassA唯一のインスタンス化時に一度起こりますMyClassAこの動作は十分に説明されているドキュメント次のように:

あなたはプロトタイプ豆の依存関係を持つシングルトンスコープのBeanを使用すると、依存関係がインスタンス化時に解決されていることに注意してください。したがって、場合シングルトンスコープのBeanにプロトタイプ・スコープのBeanに依存-注入、新しいプロトタイプBeanがインスタンス化され、その後、シングルトンBeanに依存-注入しました。プロトタイプのインスタンスは、これまでシングルトンスコープのBeanに供給されている唯一のインスタンスです。

しかし、あなたはシングルトン・スコープのBeanが実行時に繰り返しプロトタイプ・スコープのBeanの新しいインスタンスを取得するとします。SpringコンテナはシングルトンBeanと解決さをインスタンス化し、その依存関係を注入する場合、その注射は、一度だけ発生するので、あなたは、依存関係注入プロトタイプ・スコープのBeanあなたのシングルトンBeanにすることはできません。

MyClassAシングルトンである、それは常にアプリケーションの実行中に存在します。それは、その依存関係が(すなわち意味MyClassB)、常にそのことにより、使用されるMyClassAインスタンスと、彼らはGCの対象になることはありません。

あなたが新しい作成したい場合はMyClassBいつでもインスタンスをMyClassAアクセスするMyClassBには、次の手法のいずれかが記述使用することができますここで念の新しい作るMyClassBインスタンスは、いくつかのシングルトンBeanのフィールドに割り当てされることはありません、時にそのメソッド出口GCであることが対象となります。何かのようなもの:

@Service
public class MyClassA {

        @Autowired
        private Provider<MyClassB> myClassB;

        public String findMydata(String input) {
            MyClassB classB = myClassB.get(); 
            String myData = classB.getSomeData(input);    
            return myData;
        }
}

私はで説明した手法5使用しています、これを

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312307&siteId=1