Если на объект не ссылаются / не используют другие объекты, он имеет право на GC. ( Источник , см. Раздел Описание сбора мусора) .
В вашем примере, хотя вы вводите прототип MyClassB
в одноэлементный MyClassA
, MyClassAвсегда будет обращаться к одному и тому же экземпляру MyClassB
, главным образом потому, что внедрение MyClassB
в MyClassA
произойдет только один раз при создании экземпляра MyClassA
. Это поведение хорошо объяснено в документах следующим образом:
Когда вы используете компоненты с одинарной областью действия с зависимостями от компонентов-прототипов, имейте в виду, что зависимости разрешаются во время создания экземпляра. Таким образом, если вы вводите зависимый bean-объект с прототипом в bean-объект синглтона, создается новый bean-объект-прототип и затем внедряется зависимость в синглтон-компонент. Экземпляр прототипа является единственным экземпляром, который когда-либо предоставляется компоненту с одной областью действия.
Однако предположим, что вы хотите, чтобы компонент с единичной областью повторно получал новый экземпляр компонента с прототипом во время выполнения. Вы не можете внедрить зависимый bean-объект с прототипом в ваш одноэлементный bean-компонент, потому что это внедрение происходит только один раз, когда контейнер Spring создает экземпляр одноэлементного bean-компонента и разрешает и внедряет его зависимости.
As MyClassA
является единственным, он всегда существует во время выполнения приложения. Это означает, что его зависимости (то есть MyClassB
) всегда будут использоваться этим экземпляром MyClassA
, и они никогда не будут иметь права на GC.
Если вы хотите создавать новый экземпляр MyClassB
всякий раз, когда MyClassA
Доступ MyClassB
, вы можете использовать один из следующих методов описания здесь . Просто убедитесь, что новый экземпляр MyClassB
никогда не будет назначен полям какого-либо одноэлементного компонента, тогда он будет иметь право на 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, описанную в this .