Сборка мусора весной / верблюдом с инъекциями зависимостей - PullRequest
1 голос
/ 19 августа 2011

Я настроил приложение Spring (использующее Camel для интеграции с брокером ActiveMQ) таким образом, что два конкретных класса, скажем, Person и Personality, подключаются и автоматически внедряются со всеми их зависимостями через Spring контейнер. В этом примере Person объекты имеют Personality объекты в качестве элементов / свойств. Таким образом, конфигурационный файл Spring связывает экземпляр Personality, и эти bean-компоненты упоминаются в проводных People bean-компонентах:

<bean id="personality" class="com.me.someProgram.Personality" singleton="false">
    <!-- blah... -->
</bean>

<bean id="person" class="com.me.someProgram.Person" singleton="false">
    <!-- People have Personalities -->
    <property name="personality" ref="personality"/>
    <!-- blah... -->
</bean>

Оба компонента определены как прототипы в области видимости, потому что это имеет смысл для моего приложения. По сути, мне нужно захватывать новый экземпляр Personality каждый раз, когда я получаю новый Person.

Мой вопрос:

Это мое первое приложение, использующее Spring и IoC / внедрение зависимостей в целом. Я беспокоюсь о сборке мусора и утечке памяти. Когда bean-компоненты являются прототипами, а у вас есть прототипы, вложенные в прототипы (через отношение has-a ), нужно ли вам беспокоиться об утечках памяти и ГХ? Или контейнер Spring облегчает все эти проблемы для вас? Существуют ли передовые практики в отношении управления памятью Spring / IoC? Какие-нибудь анти-паттерны, чтобы избежать?

Мои настоящие бизнес-объекты довольно большие, и я буду производить многие из них, поэтому, если я начну идти по дороге, изобилующей плохим управлением памятью, это будет очень, очень ухабистая поездка.

Спасибо!

1 Ответ

1 голос
/ 24 августа 2011

В приведенном выше коде не будет проблем со сборкой мусора, вызванных spring. Вы можете думать о конфигурации пружины выше как о другом способе сказать,

Personality personality = new Personality();
Person person = new Person();
person.setPersonality(person);

Spring не поддерживает ссылку на bean-объекты-прототипы, которые он создает, поэтому сам Spring не вызовет утечку памяти.

Spring поддерживает ссылки на одноэлементные bean-объекты, и они не будут переданы gc'd, пока контекст содержимого приложения не будет.

...