Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringFactoryBean和scopes一起工作_Java_Spring - Fatal编程技术网

Java SpringFactoryBean和scopes一起工作

Java SpringFactoryBean和scopes一起工作,java,spring,Java,Spring,我想同时使用FactoryBeans和Scope。具体地说,我希望将FactoryBean创建和返回的对象放入指定(可能是自定义)范围。问题在于要做到以下几点: <bean class="x.y.z.TestFactoryBean" scope="test" /> 导致FactoryBean本身被限定范围,并且在工厂创建的对象上具有某种不可预测的行为。我明白这是为什么;工厂本身是一个一流的spring管理bean,并且有自己的生命周期。但是,我找不到一种方法来指定从工厂返回的对

我想同时使用FactoryBeans和Scope。具体地说,我希望将FactoryBean创建和返回的对象放入指定(可能是自定义)范围。问题在于要做到以下几点:

<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());
    }
    ...
 }