文章目录
上一部分中实现了可以通过XmlResourceLoader读取配置信息注册到beanFactory,但是为了方便用户使用再进行一层封装,也就是封装一个context上下文,它不仅可以帮我们初始化beanFactory,加载beanDefinition,还可以做一些功能的增强,例如spring中最重要的BeanFactoryPostProcessor和BeanPostProcessor.
目的就是为了
ConfigurableApplicationContext 接口
ConfigurableApplicationContext -> ApplicationContext -> ListableBeanFactory -> BeanFactory
定义了核心的refresh方法
public interface ConfigurableApplicationContext extends ApplicationContext{
void refresh() throws BeansException;
}
AbstractApplicationContext 具体实现接口的抽象类 (1层)
用于编排整体的方法
public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
@Override
public void refresh() throws BeansException {
// 1. 创建beanFactory并加载beanDefinition.
refreshBeanFactory();
// 2. 获取BeanFactory
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 3. 在 Bean 实例化之前,执行 BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// 4. BeanPostProcessor 需要提前于其他 Bean 对象实例化之前执行注册操作
registerBeanPostProcessors(beanFactory);
// 5. 提前实例化单例Bean对象
beanFactory.preInstantiateSingletons();
}
private void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
Map<String, BeanFactoryPostProcessor> beanFactoryPostProcessorMap = beanFactory.getBeansOfType(BeanFactoryPostProcessor.class);
for (BeanFactoryPostProcessor beanFactoryPostProcessor : beanFactoryPostProcessorMap.values()) {
beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
}
}
private void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
Map<String, BeanPostProcessor> beanPostProcessorMap = beanFactory.getBeansOfType(BeanPostProcessor.class);
for (BeanPostProcessor beanPostProcessor : beanPostProcessorMap.values()) {
beanFactory.addBeanPostProcessor(beanPostProcessor);
}
}
protected abstract void refreshBeanFactory() throws BeansException;
protected abstract ConfigurableListableBeanFactory getBeanFactory();
// getBean方法....
}
AbstractRefreshableApplicationContext (2层)
继承AbstractApplicationContext 实现它的refreshBeanFactory方法
public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext {
private DefaultListableBeanFactory beanFactory;
@Override
protected void refreshBeanFactory() throws BeansException {
DefaultListableBeanFactory beanFactory = createBeanFactory();
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
private DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory();
}
@Override
protected ConfigurableListableBeanFactory getBeanFactory() {
return beanFactory;
}
// 子类去实现的方法.
protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory);
}
AbstractXmlApplicationContext (3层)
继承 AbstractRefreshableApplicationContext实现loadBeanDefinitions
public abstract class AbstractXmlApplicationContext extends AbstractRefreshableApplicationContext{
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory, this);
String[] configLocations = getConfigLocations();
if (null != configLocations){
beanDefinitionReader.loadBeanDefinitions(configLocations);
}
}
protected abstract String[] getConfigLocations();
}
ClassPathXmlApplicationContext (4层)
继承 AbstractXmlApplicationContext,主要是用来读取xml位置调用refresh方法。
public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext{
private String[] configLocations;
public ClassPathXmlApplicationContext(String configLocations) throws BeansException{
this(new String[]{configLocations});
}
public ClassPathXmlApplicationContext(String[] configLocations) throws BeansException {
this.configLocations = configLocations;
refresh();
}
@Override
protected String[] getConfigLocations() {
return configLocations;
}
}
Bean创建方法中添加
AbstractAutowireCapableBeanFactory 添加方法
创建bean添加initializaBean
@Override
protected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) throws BeansException {
Object bean = null;
try {
bean = createBeanInstance(beanDefinition, beanName, args);
// 给 Bean 填充属性
applyPropertyValues(beanName, bean, beanDefinition);
// 执行bean的初始化方法和BeanPostProcessor的前置和后置处理方法
bean = initializeBean(beanName,bean,beanDefinition);
} catch (Exception e) {
throw new BeansException("Instantiation of bean failed", e);
}
addSingleton(beanName, bean);
return bean;
}
// 初始化bean之前调用beanPostProcessor方法增强.
public Object initializeBean(String beanName, Object bean, BeanDefinition beanDefinition){
// 1. 执行 BeanPostProcessor Before 处理
Object wrappedBean = applyBeanPostProcessorsBeforeInitialization(bean, beanName);
// 待完成内容:invokeInitMethods(beanName, wrappedBean, beanDefinition);
invokeInitMethods(beanName, wrappedBean, beanDefinition);
// 2. 执行 BeanPostProcessor After 处理
wrappedBean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
return wrappedBean;
}
具体执行的方法;
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (null == current) return result;
result = current;
}
return result;
}
// 执行bean前置处理
@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (null == current) return result;
result = current;
}
return result;
}
那么beanPostProcessor存放在了哪里呢?存放在了最开始的那一层
AbstractBeanFactory
private final List<BeanPostProcessor> beanPostProcessors = new ArrayList<BeanPostProcessor>();
public List<BeanPostProcessor> getBeanPostProcessors() {
return this.beanPostProcessors;
}
@Override
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
this.beanPostProcessors.remove(beanPostProcessor);
this.beanPostProcessors.add(beanPostProcessor);
}