为什么范围原型不适用于实现BeanPostProcessor的spring bean

时间:2015-05-06 06:59:04

标签: java spring scope

我有一个 Bean implements BeanPostProcessor

public class ScopeTest implements BeanPostProcessor {

    public ScopeTest() {
        System.out.println("ScopeTest()");
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("postProcessBeforeInitialization()");
        return null;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("postProcessAfterInitialization()");
        return null;
    }
}

我在Spring bean配置文件中将scope配置为prototype

<bean id="st" class="com.test.ScopeTest" scope="prototype" />

我使用ApplicationContext

运行代码
public class App {
    public static void main(String[] args) {
        ApplicationContext container = new ClassPathXmlApplicationContext("spring.xml");
    }
}

我观察到的输出是

ScopeTest()

这是什么使容器为没有prototype标记为getBean()的bean创建对象?

1 个答案:

答案 0 :(得分:1)

原型范围在此处不起作用,因为BeanPostProcessor实现仅在Spring应用程序上下文启动时被发现,实例化和注册。这些bean按类型排序(在实例化之前/之后等)并存储在列表中。从那里,PostProcessor bean应用于进一步的bean创建。与&#34;普通&#34;相比bean(如服务bean)在启动后第二次没有从上下文中回复。因此,不考虑他们适用的范围。