プロトタイプビーンの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使用しています、これを。