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