我有一个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创建对象?

最佳答案

原型作用域在这里不起作用,因为仅在Spring应用程序上下文启动时才发现,实例化和注册BeanPostProcessor实现。这些bean按类型排序(在实例化之前/之后等),并存储在列表中。从那里开始,将PostProcessor bean应用于进一步的bean创建。与“普通” Bean(如服务Bean)相比,启动后第二次不从上下文中检索它们。因此,不考虑它们适用的范围。

09-11 19:42