我有一个具有多个屏幕的应用程序,并通过按钮选择每个屏幕.每个屏幕都包含相当重的组件,因此重要的是只有激活屏幕在内存中 - 所有其他屏幕都应该可用于垃圾收集.
该应用程序使用Spring作为粘合剂,目前它使用getBean()切换屏幕:
//event handler for a specific button
public void actionPerformed(Event e) {
setScreen( (Screen) applicationContext.getBean("screen1"));
}
Run Code Online (Sandbox Code Playgroud)
"screen1"是原型bean,因此在按下按钮时会创建一个新的屏幕实例.此外,setScreen()是唯一在应用程序中维护对屏幕的引用的位置,因此之前活动的屏幕可用于垃圾回收.我还没有测试过这个,但我希望它能正常工作 - 这里没有火箭科学!
问题是 - 在阅读了这个页面后,为什么getBean()被认为是坏的 - 我想知道是否有一种更惯用的方法可以在删除对getBean()的依赖时获得相同的结果.
我已经看过方法注入,它在我看来引入复杂性并没什么好处.这是学习的另一个概念,更多魔术,增加对CGLIB的依赖等.如果我真的想要删除对Spring的依赖,我可以引入一个暴露getBean()方法的接口.
getBean()和方法注入是我的唯一选项还是我错过了什么?
如果是这样,getBean()真的那么糟糕吗?
您是否考虑过工厂方法?
public interface ComponentFactory<T> {
T create();
}
public class ScreenFactory implements ComponentFactory<Screen> {
@Override
Screen create() { ... }
}
public class MyApp {
private ComponentFactory<Screen> screen1;
public void actionPerformed(Event e) {
setScreen(screen1.create());
}
public void setScreen1(ComponentFactory<Screen> screen1) {
this.screen1 = screen1;
}
private void setScreen(Screen screen) { ... }
}
Run Code Online (Sandbox Code Playgroud)
结合:
<bean id="screenFactory" class="com.myclass.ScreenFactory"/>
<bean id="myapp" class="...">
<property name="screen1" ref="screenFactory"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
您当然可以自动连接上述内容。
您正在做的事情的问题在于,它既对您正在实例化的 bean 进行硬编码,又将您的实现与 ApplicationContext 联系起来。如果您需要模拟和/或单元测试您的应用程序/组件,那么这将使您的生活变得异常困难。上面的工厂解决方案将使它变得微不足道。
| 归档时间: |
|
| 查看次数: |
5949 次 |
| 最近记录: |