是否可以在不使用ApplicationContextAware的情况下检索具有原型范围的Spring bean

时间:2013-01-04 11:27:08

标签: spring dependency-injection

使用Spring 3.1。如果我想检索一个带有原型范围的bean(即我每次都想要一个不同的类实例),是否可以在不使用ApplicationContextaware类的情况下检索bean?

这就是我目前的工作方式

@Component
@Qualifier("MyService")
public class MyServiceImpl implements MyService {

    @Override
    public void doSomething() {
        Blah blah = (Blah)ApplicationContextProvider.getContext().getBean("blah");
        blah.setThing("thing");
        blah.doSomething();
    }
}


@Component("blah")
@Scope("prototype")
public class Blah {
    ....
}

ApplicationContextProvider实现ApplicationContextAware。

是否可以使用注释或简单的Spring配置执行此操作而无需使用ApplicationContextAware类?

2 个答案:

答案 0 :(得分:1)

Spring有一些相当有害的方法来实现你所追求的......

请参阅spring文档:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-scopes-other-injection

在Google上搜索spring代理范围也会产生一些结果......

答案 1 :(得分:0)

您真的不需要ApplicationContextAware。你只需要一个BeanFactory(ApplicationContextAware只是一种方便的方法)。

具有范围原型的bean只意味着每次调用ApplicationContext.getBean时都会创建一个新的bean实例。如果您尝试在单例中注入原型bean,那么您的原型bean将被注入一次(因此不再是原型)。

如果您确实需要,可以使用method injection来帮助您,但它比简单地调用applicationContext.getBean()更复杂。