我有一个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)相比,启动后第二次不从上下文中检索它们。因此,不考虑它们适用的范围。