Java SpringFactoryBean和scopes一起工作
我想同时使用FactoryBeans和Scope。具体地说,我希望将FactoryBean创建和返回的对象放入指定(可能是自定义)范围。问题在于要做到以下几点:Java SpringFactoryBean和scopes一起工作,java,spring,Java,Spring,我想同时使用FactoryBeans和Scope。具体地说,我希望将FactoryBean创建和返回的对象放入指定(可能是自定义)范围。问题在于要做到以下几点: <bean class="x.y.z.TestFactoryBean" scope="test" /> 导致FactoryBean本身被限定范围,并且在工厂创建的对象上具有某种不可预测的行为。我明白这是为什么;工厂本身是一个一流的spring管理bean,并且有自己的生命周期。但是,我找不到一种方法来指定从工厂返回的对
<bean class="x.y.z.TestFactoryBean" scope="test" />
导致FactoryBean本身被限定范围,并且在工厂创建的对象上具有某种不可预测的行为。我明白这是为什么;工厂本身是一个一流的spring管理bean,并且有自己的生命周期。但是,我找不到一种方法来指定从工厂返回的对象本身应该是作用域
另一方面,这正是我想要的(只要TestFactoryBean不实现FactoryBean接口):
因此,真正的问题是,如何让Spring像上面第二个示例那样运行,但使用真正的FactoryBean?您不能轻松地在从
FactoryBean
返回的bean上使用自定义范围
来自Spring的:
FactoryBeans可以支持单例和原型
如果希望FactoryBean
的返回bean具有原型作用域,则必须实现isSingleton()
方法,如下所示:
public class TestFactoryBean implements FactoryBean<TestBean> {
// the rest of the required methods are removed for simplicity reasons..
public boolean isSingleton() {
return false;
}
}
公共类TestFactoryBean实现FactoryBean{
//出于简单的原因,删除了其余必需的方法。。
公共布尔isSingleton(){
返回false;
}
}
要支持自定义作用域,您必须自己实现逻辑,这将不是很直观,因为FactoryBean
只提供isSingleton()
方法。对于具有自定义范围的bean,我建议使用另一种解决方案,而不是FactoryBean
希望这有帮助 我使用CustomHolder bean解决了同样的问题 工厂bean:
@Component
@Configurable()
public class EventBusFactory implements FactoryBean<EventBus> {
@Override
public EventBus getObject() throws Exception {
return new SimpleEventBus();
}
@Override
public Class<?> getObjectType() {
return EventBus.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
然后我使用holder而不是所需的实体
@Component
@Configurable
@Scope("session")
public class UicPlaceController extends PlaceController {
@Autowired
public UicPlaceController(EventBusHolder eventBus) {
super(eventBus.getEventBus());
}
...
}
这个解决方案看起来有点难看,但仍然解决了这个问题。您可以在spring中自定义几乎所有内容,因此我想这是可能的,但可能会涉及一些非常深入的挖掘(使用自定义应用程序上下文)或类似的内容。但我在这里猜测,我猜Holder的这项工作可以改进,但现在它对我有效。
@Configurable
@Component
@Scope("session")
public class EventBusHolder {
@Autowired
private EventBus eventBus;
public EventBus getEventBus() {
return eventBus;
}
public void setEventBus(EventBus eventBus) {
this.eventBus = eventBus;
}
}
@Component
@Configurable
@Scope("session")
public class UicPlaceController extends PlaceController {
@Autowired
public UicPlaceController(EventBusHolder eventBus) {
super(eventBus.getEventBus());
}
...
}