文章目录
1. postProcessBeanFactory(beanFactory)的思考
此方法是在refresh()模板方法中,但是此方法的实现是空的。因为此方法的参数是BeanFactory,所以我们可以重写此方法,然后针对beanFactory进行一些修改。
2. 自定义实现ApplicationContext对象,重写postProcessBeanFactory(beanFactory)方法。
我们可以自定义去实现了一个ApplicationContext对象,并且重写此方法,可以针对beanFactory进行一些定制化修改。例如:
编写一个MyApplicationContext类,继承AnnotationConfigApplicationContext类。这样我们已经具备了AnnotationConfigApplicationContext的功能。
public class MyApplicationContext extends AnnotationConfigApplicationContext {
// 此处完美继承父类的功能
public MyApplicationContext(Class<?>... componentClasses) {
super(componentClasses);
}
@Override
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 此处我们获取到了beanFactory对象
// 通过调用beanFactory的API可以进行任何的操作。
if (beanFactory instanceof DefaultListableBeanFactory){
System.out.println(true);
}
}
}
测试一下:
public class SpringDemo {
public static void main(String[] args) {
// 此处我随便注册了一个类
MyApplicationContext myApplicationContext = new MyApplicationContext(Config.class);
Phone phone = myApplicationContext.getBean(Phone.class);
}
}
结果:
3. 思考的结果
此方法其实类似于BeanFactory的后置处理器,可以获取到BeanFactory对象,基于BeanFactory对象,就可以通过调用BeanFactory做一些事情。