当前位置: 首页 > 知识库问答 >
问题:

Spring按需创建原型Bean并引用稍后创建的Bean

叶光华
2023-03-14

我是spring的新手,我正在尝试修改我的应用程序来实现spring框架。我的请求是为每一个新请求创建一个新bean,然后在后面的代码中引用该bean,以便从单个bean中为其设置值。我正在尝试将bean声明为prototype,并使用查找方法在我的单例bean中引用该bean。但我的问题是,当稍后尝试获取创建的原型bean以设置值时,我看到它在获取bean时再次创建新的bean。

@Component
public class PersonTransaction {

    @Autowired
    PersonContext btContext;
    @Autowired
    PersonMapper personMapper;

    public void setPersonMapper(PersonViewMapper personMapper) {
        this.personMapper = personMapper;
    }

    public PersonBTContext createContext() throws ContextException {
        return btContext = getInitializedPersonBTInstance();
    }

    private PersonBTContext getContext() throws ContextException{
        return this.btContext;
    }

    public void populateView(UserProfileBean userProfile) throws ContextException {
        personMapper.populateView(userProfile,getContext());
    }

    @Lookup(value="personContext")
    public  PersonBTContext getInitializedPersonBTInstance(){
        return null;
    }
}

下面是我的原型类

@Component("personContext")
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PersonContext extends ReporterAdapterContext {
    private List<Person> persons = null;
    private Person person = null;
    private List<String> attributes = null;

    private boolean multiplePersons = false;
    private boolean attributeSelected = false;

    public boolean isMultiple() {
        return multiplePersons;
    }

    public boolean isAttributeSelected() {
        return attributeSelected;
    }

    private void setAttributeSelected(boolean attributeSelected) {
        this.attributeSelected = attributeSelected;
    }

    // remaining getters/setters

    }

当我从singleton PersonTransaction类调用createContext时,它应该创建新的原型bean,然后如何通过调用getContext()方法获得创建的原型bean(我想我正在做的是.btContext再次返回新bean!!)。

稍后需要帮助获取创建的原型bean以设置值。

共有1个答案

巴星华
2023-03-14

您希望创建一个请求作用域bean,而不是原型作用域bean。看看Spring Bean作用域的快速指南,它描述了不同的Bean作用域,包括请求作用域:

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public PersonContext personContext() {
  return new PersonContext();
}

这应该会简化您的逻辑,只要您可以在处理请求后丢弃bean。

 类似资料:
  • 因此,关于原型范围的bean,我知道spring只是在将其移交给请求的bean之前将其进行生命周期处理。如果忘记了它。而且从逻辑上我可以理解,因为它是原型,它将只被每个请求使用(是的,不是http请求)但是spring容器为什么不保留原型bean的引用来管理完整的生命周期呢?

  • 当使用Spring Framework时,我怀疑在下面提到的场景中会创建多少实例: bean配置如下 默认情况下,bean“a”具有。因此,有一个单例bean引用了一个具有会话范围或原型范围的bean。 在这种情况下,如果有2个对应用程序的同时请求,那么将创建多少个A实例和多少个B实例? 如果有人能解释这是如何工作的,那将是非常有帮助的。 谢了达薇亚

  • 我正在尝试基于此示例编写自己的代码。 我使用的是Spring Boot,所有依赖项都来自https://start.spring.io/ 这是我的知识库: 我的控制器的一部分: 我的Spring Boot: 我收到此错误: 我做错了什么?如果有必要,我可以发布更多类似实体的代码 我正在使用IntelliJ IDEA。

  • 我对JAVA web应用程序非常陌生,所以请记住这一点。我承担了一个非常大的项目,令人望而生畏。我终于修复了Maven依赖,现在在Tomcat上运行时遇到了第一个错误。 包含eu.digient.billfold.goshgame.game.level.ItemConfigFactoryImpl模块的Spring配置:

  • 我有一个关于Spring注释配置的问题。我有一颗豆子:

  • 我是spring及其概念的初学者。我试图使用@Configuration和package scan注释来扫描单个包下的一些bean提供程序类。当其中一个类的@Bean注释方法与另一个不同类的@Bean注释方法同名时,两个类都不会创建Bean。如果我将@bean注释的方法名称更改为未创建的bean的另一个名称,那么两个bean都会成功创建。无法理解这种行为。 如果我正在创建另一个类,如顶部下面的Be