Spring FactoryBean和范围一起工作
我想将FactoryBeans和示波器一起使用。 具体来说,我希望将FactoryBean创建并返回的对象放入指定的(可能是自定义的)范围。 问题是执行以下操作:
FactoryBean本身的结果是作用域,并且对工厂创建的对象有一些不可预测的行为。 我明白为什么会这样; 工厂本身是一流的春季管理的豆,并有自己的生命周期。 但是,我找不到一种方法来指定从工厂返回的对象本身应该是作用域。
另一方面,这正是我想要的(只要TestFactoryBean不实现FactoryBean接口):
所以真正的问题是,我如何使Spring的行为与上面的第二个例子一样,但使用真正的FactoryBeans?
您无法在从FactoryBean
返回的bean上轻松使用自定义作用域。
从Spring的Java文档 :
FactoryBeans可以支持单例和原型
如果您希望FactoryBean
的返回bean具有原型范围,那么您必须实现isSingleton()
方法,如下所示:
public class TestFactoryBean implements FactoryBean { // the rest of the required methods are removed for simplicity reasons.. public boolean isSingleton() { return false; } }
要支持自定义范围,您必须自己实现逻辑,并且它不会非常直观,因为FactoryBean
仅提供isSingleton()
方法。 对于具有自定义范围的bean,我建议使用除FactoryBean
之外的其他解决方案。
希望这可以帮助!
我使用自定义持有者bean解决了同样的问题。
工厂豆:
@Component @Configurable() public class EventBusFactory implements FactoryBean { @Override public EventBus getObject() throws Exception { return new SimpleEventBus(); } @Override public Class> getObjectType() { return EventBus.class; } @Override public boolean isSingleton() { return false; } }
豆架:
@Configurable @Component @Scope("session") public class EventBusHolder { @Autowired private EventBus eventBus; public EventBus getEventBus() { return eventBus; } public void setEventBus(EventBus eventBus) { this.eventBus = eventBus; } }
然后我使用holder而不是所需的实体。
@Component @Configurable @Scope("session") public class UicPlaceController extends PlaceController { @Autowired public UicPlaceController(EventBusHolder eventBus) { super(eventBus.getEventBus()); } ... }
解决方案看起来有点难看,但仍然解决了这个问题。