参考资料:《Spring揭秘》
Spring ioc是一个提供ioc支持的容器,ioc就不废话了。
Spring提供两种容器类型:BeanFactory ApplicationContext
BeanFactory是基础类型的ioc容器,默认采用延迟初始化的策略(lazy-load),所以容器启动初期速度较快,ApplicationContext是在BeanFactory的基础之上构建的。功能更多(这些多事废话)……..
先看看BeanFactory的定义:
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException;
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
/*这些方法的意思,看名字就知道了。*/
DefaultListableBeanFactory是BeanFactory的一个实现类。
这是DefaultListableBeanFactory的继承关系图
(图片来自http://www.cnblogs.com/davidwang456/p/4187012.html)
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
他实现了BeanDefinitionRegistry,BeanDefinitionRegistry通过名字可以知道这是一个BeanDefinition的注册器
在SPring中,每个Bean都有一个对应的BeanDefinition,这个类负责保存对应的Bean的信息,包括class类型,是否抽象,构造方法,以及参数和其他属性。
package org.springframework.beans.factory.config;
import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;
/**
* A BeanDefinition describes a bean instance, which has property values,
* constructor argument values, and further information supplied by
* concrete implementations.
*
* <p>This is just a minimal interface: The main intention is to allow a
* {@link BeanFactoryPostProcessor} such as {@link PropertyPlaceholderConfigurer}
* to introspect and modify property values and other bean metadata.
*
* @author Juergen Hoeller
* @author Rob Harrop
* @since 19.03.2004
* @see ConfigurableListableBeanFactory#getBeanDefinition
* @see org.springframework.beans.factory.support.RootBeanDefinition
* @see org.springframework.beans.factory.support.ChildBeanDefinition
*/
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;
String getParentName();
void setParentName(String parentName);
String getBeanClassName();
void setBeanClassName(String beanClassName);
String getFactoryBeanName();
void setFactoryBeanName(String factoryBeanName);
String getFactoryMethodName();
void setFactoryMethodName(String factoryMethodName);
String getScope();
void setScope(String scope);
boolean isLazyInit();
void setLazyInit(boolean lazyInit);
String[] getDependsOn();
void setDependsOn(String[] dependsOn);
boolean isAutowireCandidate();
void setAutowireCandidate(boolean autowireCandidate);
boolean isPrimary();
void setPrimary(boolean primary);
/*构造函数的参数值*/
ConstructorArgumentValues getConstructorArgumentValues();
MutablePropertyValues getPropertyValues();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
int getRole();
String getDescription();
String getResourceDescription();
BeanDefinition getOriginatingBeanDefinition();
}
这是BeanDefinition接口的定义。
然后在 DefaultListableBeanFactory对应的有一个数据结构来保存每个Bean对应的BeanDefinition
/** Map of bean definition objects, keyed by bean name */
/*bean definition*/
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>();
DefaultListableBeanFactory用了一个Map来保存这些信息,这样每一个Bean在DefaultListableBeanFactory中都有信息保存了下来,为生成Bean提供条件
还在看Spring的源码,DefaultListableBeanFactory就先这么简单的说一下,