Ioc-контейнер Spring на самом деле является сетью отношений bean-компонентов, построенной на трех компонентах: ядре, bean-компоненте и контексте. Ядром весны является управление бобами. И бобы полагаются на наш контейнер. В этой статье будет проанализирован конкретный процесс создания beanFactory весной с верхнего уровня и предоставлена основа для последующего жизненного цикла компонента.
Система наследования BeanFactory
Как видно из рисунка выше, BeanFactory имеет три подкласса:- ListableBeanFactory
- HierarchicalBeanFactory
- AutowireCapableBeanFactory
(Вы можете посмотреть исходный код системы подклассов вышеперечисленных трех классов, их слишком много)
Посмотрите на определение самого нижнего класса DefaultListableBeanFactory на рисунке выше:
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable
На самом деле это класс реализации BeanFactory по умолчанию, который прямо или косвенно реализует все интерфейсы. На самом деле, глядя на исходный код Spring, вы столкнетесь с похожими шаблонами проектирования: для конкретной функции обычно определяется множество слоев интерфейсов, слоев упаковки и уровней делегирования. Преимущество такого подхода в том, что будут определенные интерфейсы для разных случаев, таким образом, будут некоторые ограничения доступа к операциям передачи и преобразования объектов внутри spring.
Например, интерфейс ListableBeanFactory указывает, что эти bean-компоненты доступны для просмотра, а HierarchicalBeanFactory указывает, что эти bean-компоненты наследуются, то есть каждый bean-компонент может иметь родительский bean-компонент. Интерфейс AutowireCapableBeanFactory определяет правила автоматического связывания для bean-компонентов. Эти четыре интерфейса совместно определяют набор бинов, отношения между бинами и поведение бинов.
Создание BeanFactory
Процесс обновления контейнера упоминался в предыдущей статье. Создание BeanFactory также находится в методе wac.refresh(). В частности, давайте посмотрим, какие подклассы используются для его завершения:
// 通知子类刷新内部的bean工厂。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
1. получитьFreshBeanFactory в AbstractApplicationContext
Ниже приведена логика методаgetFreshBeanFactory:
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
//这个是具体创建的方法,由子类实现
refreshBeanFactory();
//获取BeanFactory实例对象(ConfigurableListableBeanFactory类型的)
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
Для refreshBeanFactory нет конкретной логики реализации. Этот метод в основном реализуется методом refreshBeanFactory, делегированным подклассам. В AbstractApplicationContext, refreshBeanFactory является абстрактным методом шаблона:
protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
2. Метод refreshBeanFactory (в классе AbstractRefreshableApplicationContext):
下面只注释与beanFactory创建相关的代码
protected final void refreshBeanFactory() throws BeansException {
//是否已经有BeanFactory了
if (hasBeanFactory()) {
//销毁原有的Bean
destroyBeans();
//关闭工厂
closeBeanFactory();
}
try {
//创建一个新的beanFactory
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition
source for " + getDisplayName(), ex);
}
}
Этот метод предназначен для реализации фактического обновления базовой фабрики компонентов, которая выполняет этот контекст, закрывая предыдущую фабрику компонентов, если она существовала ранее. И инициализируйте новую фабрику компонентов для следующего этапа жизненного цикла контекста.
3.createBeanFactory (в классе AbstractRefreshableApplicationContext)
protected DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
Этот метод создает внутреннюю фабрику компонентов для текущего контекста. Каждый раз, когда вызывается метод refresh(), делается попытка его создать. Реализация по умолчанию заключается в создании DefaultListableBeanFactory. И получить внутреннюю фабрику компонентов в качестве родительской фабрики компонентов через getInternalParentBeanFactory(). Может быть переопределен в подклассах, например, для настройки параметров DefaultListableBeanFactory.
getInternalParentBeanFactory (в классе AbstractApplicationContext)
protected BeanFactory getInternalParentBeanFactory() {
return (getParent() instanceof ConfigurableApplicationContext) ?
((ConfigurableApplicationContext) getParent()).getBeanFactory() : getParent();
}
4. Конструктор DefaultListableBeanFactory
/**
* 通过给定的父类创建一个新的DefaultListableBeanFactory容器
* @param parentBeanFactory the parent BeanFactory
*/
public DefaultListableBeanFactory(BeanFactory parentBeanFactory) {
super(parentBeanFactory);
}
super(parentBeanFactory) вызывает конструктор AbstractAutowireCapableBeanFactory
/**
* 通过给定的父类构建新的AbstractAutowireCapableBeanFactory
* @param parentBeanFactory parent bean factory, or {@code null} if none
*/
public AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory) {
this();
//设置父工厂
setParentBeanFactory(parentBeanFactory);
}
this() или конструктор AbstractAutowireCapableBeanFactory:
/**
* 构建一个新的AbstractAutowireCapableBeanFactory.
*/
public AbstractAutowireCapableBeanFactory() {
super();
ignoreDependencyInterface(BeanNameAware.class);
ignoreDependencyInterface(BeanFactoryAware.class);
ignoreDependencyInterface(BeanClassLoaderAware.class);
}
super() ; Конструктор AbstractBeanFactory
/**
* 构建一个新的AbstractBeanFactory.
*/
public AbstractBeanFactory() {
}