我有一个具有多个屏幕的应用程序,每个屏幕都是通过一个按钮选择的。每个屏幕都包含非常重的组件,因此内存中只有激活屏幕很重要-所有其他屏幕都应可用于垃圾回收。
该应用程序使用Spring进行粘合,当前使用getBean()切换屏幕:
//event handler for a specific button
public void actionPerformed(Event e) {
setScreen( (Screen) applicationContext.getBean("screen1"));
}
“screen1”是原型(prototype)bean,因此在按下按钮时会创建一个新的屏幕实例。另外,setScreen()是在应用程序中唯一维护对Screen的引用的位置,因此先前处于 Activity 状态的屏幕将可用于垃圾回收。我还没有测试过,但是我希望它能正常工作-这里没有火箭科学!
问题是-在阅读了有关为什么将getBean()视为错误的this page之后,我想知道是否存在一种更惯用的方式来达到相同的结果,同时消除对getBean()的依赖性。
我已经看过方法注入(inject),并且对我来说,引入复杂性并没有多大好处。这是另一个需要学习的概念,它具有更多的魔力,增加了对CGLIB的依赖等。如果我真的想删除对Spring的依赖,我可以引入一个暴露getBean()方法的接口(interface)。
在我的情况下,getBean()和方法注入(inject)是唯一的选择还是我错过了什么?
如果是这样,getBean()真的那么糟糕吗?
最佳答案
setter 注入(inject),属性注入(inject)或构造函数注入(inject)都创建了一个松耦合的应用程序,该应用程序更容易通过模拟进行测试。它还可以防止您的任何类直接依赖于Spring(或其他IoC容器)类。当您不必手动调用getBean()时,它最终只是一个更干净的整体解决方案。
我认为您应该对配置依赖项的概念感到满意。 “魔术”根本不是真正的魔术,只是您在使用它时会感到满意的东西。
关于java - 在Spring中使用getBean而不是方法注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1154192/