gpt4 book ai didi

java - 单例中的 Spring Prototype 范围 bean

转载 作者:IT老高 更新时间:2023-10-28 13:46:20 24 4
gpt4 key购买 nike

我正在尝试在 singleton bean 中注入(inject) prototype bean,这样每次对单例 bean 方法的新调用都有一个原型(prototype) bean 的新实例。

考虑如下的单例 bean:

    @Component
public class SingletonBean {
@Autowired
private PrototypeBean prototypeBean;

public void doSomething() {
prototypeBean.setX(1);
prototypeBean.display();
}
}

我希望每次调用 doSomething() 方法时,都会使用一个新的 PrototypeBean 实例。

下面是原型(prototype)bean:

     @Component 
@Scope(value="prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class PrototypeBean {
Integer x;

void setX(Integer x) {
this.x = x;
}

void display() {
System.out.println(x);
}
}

似乎正在发生的事情是,spring 过于急于在 doSomething() 方法中移交 PrototypeBean 的新实例。也就是说,doSomething() 方法中的两行代码在每一行中都创建了一个新的prototypeBean 实例。

所以在第二行 - prototypeBean.display() 打印 NULL

此注入(inject)的配置中缺少什么?

最佳答案

从 Spring documentation :

You do not need to use the <aop:scoped-proxy/> in conjunction with beans that are scoped as singletons or prototypes. If you try to create a scoped proxy for a singleton bean, the BeanCreationException is raised.

3.2 版的文档似乎有所更改 documentation在哪里可以找到这句话:

You do not need to use the <aop:scoped-proxy/> in conjunction with beans that are scoped as singletons or prototypes.

您似乎不希望使用代理原型(prototype) bean,因为每次都向 BeanFactory 请求它。它将创建它的一个新实例。


为了为您的原型(prototype) bean 创建一种工厂,您可以使用 ObjectFactory如下:

@Component
public class SingletonBean {

@Autowired
private ObjectFactory<PrototypeBean> prototypeFactory;

public void doSomething() {
PrototypeBean prototypeBean = prototypeFactory.getObject();
prototypeBean.setX(1);
prototypeBean.display();
}
}

您的原型(prototype) bean 将声明如下:

@Component 
@Scope(value="prototype")
public class PrototypeBean {
// ...
}

关于java - 单例中的 Spring Prototype 范围 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25165507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com