我已经配置了一个Spring应用程序(使用Camel与ActiveMQ代理集成),这样两个特定的类,比如Person
和Personality
,就可以连接并注入所有依赖项自动通过Spring容器。为了这个例子,Person
个对象有 Personality
个对象作为成员/属性。所以Spring配置文件连接Personality
实例,并且有线People
bean中引用了这些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>
两个bean都在范围内指定为 prototypes ,因为这对我的应用程序有意义。基本上,我每次获得新Personality
时都需要抓取Person
的新实例。
我的问题:
这是我第一次使用Spring和IoC /依赖注入的应用程序。我担心垃圾收集和内存泄漏。当bean是原型时,你有原型嵌套在原型中(通过 has-a 关系),你是否需要担心GC /内存泄漏?或者Spring容器能否为您解决所有这些问题?是否有关于Spring / IoC内存管理的最佳实践?任何反模式都可以避开?
我的实际业务对象非常庞大,而且我会生产很多,所以如果我开始走上一条充满糟糕内存管理的道路,那将是一次非常非常颠簸的旅程。
谢谢!
答案 0 :(得分:1)
上面的代码中由spring引起的垃圾收集没有问题。您可以将上面的spring配置视为另一种说法,
Personality personality = new Personality();
Person person = new Person();
person.setPersonality(person);
Spring没有维护对它创建的原型bean的引用,因此spring本身不会导致内存泄漏。
Spring确实维护对单例作用域bean的引用,并且在包含应用程序上下文之前不会对它们进行gc。