FactoryBean和BeanFactory
FactoryBean和BeanFactory都是用来生产对象的,但BeanFactory更多的是生产一些标准对象,但FactoryBean提供了很多类似模板的方法,可以生产自定义的bean。主要提供了三个方法
FactoryBean是一种将对象构造逻辑封装在类中的模式,可以用于以可重用的方式对复杂对象的构造进行编码。通常被用来构造具有许多依赖关系的复杂对象。
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<T> getObjectType();
boolean isSingleton();
}
- getObjec()方法会返回该FactoryBean生产的对象实例,我们需要实现该方法以给出自己的对象实例逻辑;
- getObjectType()方法返回getObject()方法所返回的对象的类型,如果预习无法确定,则返回null
- isSingleton()方法返回结果用于表明,工厂方法getObject()所生产的对象是否要以singleton形式存在于容器中。如果以singleton形式存在,则返回true,否则返回false;
六个关键的接口
- BeanFactory
- FactoryBean
- BeanDefinitionReader
- BeanFactoryPostProcessor
- BeanPostProcessor
- Environment
IOC容器中存在很多父子容器之间的继承关系,先在子类中找,找不到的话再去父类中找。
先创建一个工厂类,在工厂类创建对象之前,先利用BeanFactoryPostProcessor()完成相关的功能扩展。
public void refresh() throws BeansException, IllegalStateException {
//startupShutdownMonitor:refresh方法和destory方法公用的一个监视器,避免两个方法同时执行
synchronized(this.startupShutdownMonitor) {
//刷新前预处理
this.prepareRefresh();
//创建一个beanFactory
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
//往beanFactory里设置一些组件
this.prepareBeanFactory(beanFactory);
try {
//做一些增强的实现
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
//进行国际化的配置
this.initMessageSource();
//多播器
this.initApplicationEventMulticaster();
//空方法,留给子类进行实现扩展
this.onRefresh();
//注册监听器
this.registerListeners();
//实现某些非懒加载的组件
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
再看细节
prepareRefresh方法
只是完成一些准备工作,没有核心方法
设置时间,创建一些标志位,启动环境变量,创建了一些空的监听集合对象
//刷新前的预处理
protected void prepareRefresh() {
this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);
if (this.logger.isInfoEnabled()) {
this.logger.info("Refreshing " + this);
}
//初始化属性设置(未实现)
this.initPropertySources();
//检验配置文件
this.getEnvironment().validateRequiredProperties();
//保存当前容器里的事件
this.earlyApplicationEvents = new LinkedHashSet();
}
obtainFreshBeanFactory():销毁旧beanFactory,创建新beanFactory
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
Spring中Bean的生命周期???
设置了一些aware接口,这些aware接口就是设置了一些属性,方便后续使用时直接从容器中获取相关的属性值即可。
- BeanFactoryPostProcessor是在工厂实例化的时候使用的
- BeanPostProcessor是在对象实例化的时候使用的