一、AutowireCapableBeanFactory:提供了自动装配Bean的实现,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。
其通过实现类AbstractAutowireCapableBeanFactory 实现bean的创建,对应源码:
进一步查看createBean():
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
Object beanInstance = doCreateBean(beanName, mbdToUse, args);-----执行创建Bean
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
doCreateBean():创建bean实例
// Initialize the bean instance.
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);----用bean定义中的属性值填充给定BeanWrapper中的bean实例。
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);---初始化给定的bean实例,应用工厂回调以及init方法和bean后处理器。
}
}
二、HierarchicalBeanFactory:该子接口由bean工厂实现的子接口可以是层次结构的一部分。bean工厂的相应setParentBeanFactory方法允许以可配置的方式设置父类,可以在ConfigurableBeanFactory接口中找到。
三、ListableBeanFactory
bean工厂将实现BeanFactory接口的扩展,这些bean工厂可以枚举它们的所有bean实例,而不是按照客户机的请求逐个尝试bean查找。预加载所有bean定义(例如基于xml的工厂)的BeanFactory实现可以实现此接口。可以通过xml去获取bean。其实现类StaticListableBeanFactory提供了通过不同条件获取bean的方法。getBean(String name)、getBean(String name, Class<T> requiredType)、getBean(Class<T> requiredType)等。
BeanFactory工厂实现应该尽可能支持标准Bean生命周期接口。全套初始化方法及其标准顺序为:
1.BeanNameAware setBeanName
2.BeanClassLoaderAware setBeanClassLoader
3.BeanFactoryAware setBeanFactory
4.EnvironmentAware setEnvironment
5.EmbeddedValueResolverAware setEmbeddedValueResolver
6.ResourceLoaderAware setResourceLoader(仅适用于在应用程序上下文中运行时)
7.ApplicationEventPublisherAware setApplicationEventPublisher(仅适用于在应用程序上下文中运行时)
8.MessageSourceAware setMessageSource(仅适用于在应用程序上下文中运行时)
9.applicationcontext - ware setApplicationContext(仅适用于在应用程序上下文中运行时)
10.servletcontext(仅适用于在web应用程序上下文中运行时)
11.beanpostprocessor 初始化方法之前的后处理
12.InitializingBean afterPropertiesSet
13.一个自定义的init-method定义
14.beanpostprocessor 处理后初始化方法
在关闭bean工厂时,应用以下生命周期方法:
1.析构的后处理方法
2.DisposableBean的破坏
3.自定义销毁方法定义