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

时间:2018-08-09 18:48:59

标签: spring spring-boot spring-aop

我是spring的新手,我正在尝试修改我的应用以实现spring框架。 我的请求是为每个新请求创建一个新bean,然后在代码中稍后引用该bean,以便从单例bean中为其设置值。 我试图将bean声明为原型,并使用查找方法在我的singleton 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

    }

当我从单例PersonTransaction类中调用createContext时,它应该创建一个新的原型bean,以及以后如何通过调用getContext()方法来获取创建的原型bean(我在做什么。btContext再次返回了新的bean,我想!!)..

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您要创建请求范围的Bean,而不是原型范围的Bean。看一下Quick Guide to Spring Bean Scopes,它描述了不同的bean范围,包括请求范围:

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

这将简化您的逻辑,只要您可以在处理请求后丢弃Bean。