Spring 系列目录(http://www.javashuo.com/article/p-kqecupyl-bm.html)html
BeanFactory 是Spring IOC 容器的鼻祖,是 IOC 容器的基础接口,全部的容器都是从它这里继承实现而来,可见其地位。BeanFactory 提供了最基本的 IOC 容器的功能,即全部的容器至少须要实现的标准。java
public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; // 1. getBean Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; // 2. @since 5.1 <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType); <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); // 3. containsBean boolean containsBean(String name); // 4. 单例、多例。 bean 的生命周期 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 5. 匹配 bean 的 Class 类型或泛型(ResolvableType) boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 6. 其它属性 Class<?> getType(String name) throws NoSuchBeanDefinitionException; String[] getAliases(String name); }
这些接口定义勾画出了 IOC 容器的基本方法特性。BeanFactory 功能以下:spring
BeanFactory 做为最顶层的一个接口类,它定义了 IOC 容器的基本功能规范,BeanFactory 有三个直接子类接口:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory,还有一个实现类 SimpleJndiBeanFactory。因此接下来依次分析三个子接口。缓存
从 HierarchicalBeanFactory 接口开始就有了父子工厂的概念。app
public interface HierarchicalBeanFactory extends BeanFactory { // 1. 获取父工厂 BeanFactory getParentBeanFactory(); // 2. 在当前工厂(不向上查找父工厂)中获取指定的 bean boolean containsLocalBean(String name); }
从 ListableBeanFactory 接口开始能够枚举出本工厂生产的全部 bean 了。ide
public interface ListableBeanFactory extends BeanFactory { // 1. 查找 BeanDefinition boolean containsBeanDefinition(String beanName); int getBeanDefinitionCount(); String[] getBeanDefinitionNames(); // 2. 根据类型查找全部 bean 的名称,包括 FactoryBean // includeNonSingletons=false 表示只取单例; // allowEagerInit=true 表示当即加载,false 表示延迟加载。注意:FactoryBean 都是马上加载的 String[] getBeanNamesForType(Class<?> type); String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit); // 3. 根据类型查找全部 bean,返回 <beanName, bean> <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; // 4.1 根据类上的注解类型查找指定的 bean String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType); Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException; // 4.2 查找指定 bean 上的注解 <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException; }
总结一下:post
从 AutowireCapableBeanFactory 接口开始能够自动装配 bean 了。ui
AutowireCapableBeanFactory 直接继承自 BeanFacotory,它扩展了自动装配的功能,根据类定义 BeanDefinition 装配 Bean、执行后置处理器等。值得注意的是,这个接口并无被 ApplicationContext 继承,由于应用程序几乎不用用到这些接口,固然也能够经过 ApplicationContext#getAutowireCapableBeanFactory() 得到这个 BeanFactory 实例。prototype
public interface AutowireCapableBeanFactory extends BeanFactory { // 1. 自动装配的模式,AUTOWIRE_AUTODETECT 已废弃 int AUTOWIRE_NO = 0; int AUTOWIRE_BY_NAME = 1; int AUTOWIRE_BY_TYPE = 2; int AUTOWIRE_CONSTRUCTOR = 3; int AUTOWIRE_AUTODETECT = 4; //------------------------------------------------------------------------- // Typical methods for creating and populating external bean instances //------------------------------------------------------------------------- // 2. 默认的方式建立、自动装配、配置 bean <T> T createBean(Class<T> beanClass) throws BeansException; void autowireBean(Object existingBean) throws BeansException; Object configureBean(Object existingBean, String beanName) throws BeansException; //------------------------------------------------------------------------- // Specialized methods for fine-grained control over the bean lifecycle //------------------------------------------------------------------------- // 3. 根据给定的策略,建立、自动装配、配置 bean Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException; // 4. bean 属性注入 void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; // 5. bean 生命周期相关的初始化,如 BeanFactoryAware#setBeanFactory、InitializingBean#afterPropertiesSet Object initializeBean(Object existingBean, String beanName) throws BeansException; void destroyBean(Object existingBean); // 6. 后置处理器 BeanPostProcessors 执行 Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; // 7. <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException; // 8. 属性注入时根据类型查找依赖,支持 List<BeanA> list 集合类型注入 Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, String beanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException; }
总结一下:code
AUTOWIRE_BY_NAME
:把与 Bean 的属性具备相同的名字的其余 Bean 自动装配到这个属性上。举个例子就是:当有一个属性名字为 person 时,则自动装配策略选择 id 为 person 的 Bean 进行装配。AUTOWIRE_BY_TYPE
:把与 Bean 的属性具备相同的类型的其余 Bean 自动装配到这个属性。AUTOWIRE_BY_CONSTRUCT
:把与 bean 的构造器入参具备相同类型的其余 Bean 自动装配到 Bean 构造器的对应参数中。还有两类方法,实际上工做中不多直接用这几个接口
实现类为 AbstractAutowireCapableBeanFactory。还有两个配置的接口 ConfigurableBeanFactory 和 ConfigurableListableBeanFactory 也须要关注一下。
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry { String SCOPE_SINGLETON = "singleton"; String SCOPE_PROTOTYPE = "prototype"; // 1. 父工厂 void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; // 2. ClassLoader void setBeanClassLoader(@Nullable ClassLoader beanClassLoader); ClassLoader getBeanClassLoader(); void setTempClassLoader(@Nullable ClassLoader tempClassLoader); ClassLoader getTempClassLoader(); // 3. 缓存 void setCacheBeanMetadata(boolean cacheBeanMetadata); boolean isCacheBeanMetadata(); // 4. Spring el 表达式解析器 void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver); BeanExpressionResolver getBeanExpressionResolver(); // 5.1 ConversionService 类型转换 void setConversionService(@Nullable ConversionService conversionService); ConversionService getConversionService(); // 5.2 PropertyEditor 类型转换 void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass); void copyRegisteredEditorsTo(PropertyEditorRegistry registry); // 5.3 类型转换 void setTypeConverter(TypeConverter typeConverter); TypeConverter getTypeConverter(); // 6. ${key} 占位符解析 void addEmbeddedValueResolver(StringValueResolver valueResolver); boolean hasEmbeddedValueResolver(); String resolveEmbeddedValue(String value); // 7. 后置处理器 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); int getBeanPostProcessorCount(); // 8. void registerScope(String scopeName, Scope scope); String[] getRegisteredScopeNames(); Scope getRegisteredScope(String scopeName); AccessControlContext getAccessControlContext(); // 9. copy 配置 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); // 10. bean 别名注册 void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; void resolveAliases(StringValueResolver valueResolver); // 11. BeanDefinition BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // 12. FactoryBean boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; // 13. bean 建立状态 void setCurrentlyInCreation(String beanName, boolean inCreation); boolean isCurrentlyInCreation(String beanName); // 14. 注册依赖 void registerDependentBean(String beanName, String dependentBeanName); String[] getDependentBeans(String beanName); String[] getDependenciesForBean(String beanName); // 15. 销毁 bean void destroyBean(String beanName, Object beanInstance); void destroyScopedBean(String beanName); void destroySingletons(); }
实现类为 AbstractBeanFactory。
提供解析,修改 bean定义,并与初始化单例。
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory { // 1. 忽略依赖检查,如 String/BeanFacory void ignoreDependencyType(Class<?> type); void ignoreDependencyInterface(Class<?> ifc); // 2. 注册依赖关系 void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue); // 3. 依赖注入时查找是不是能够依赖的 bean boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException; // 4. BeanDefinition 和 bean 遍历 BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; Iterator<String> getBeanNamesIterator(); // 5. 清除不能缓存的 BeanDefinition,当 configurationFrozen=true 时能够缓存 void clearMetadataCache(); // 5.2 configurationFrozen=true 时缓存 BeanDefinition 信息 void freezeConfiguration(); boolean isConfigurationFrozen(); // 6. 实例化非懒加载的 bean void preInstantiateSingletons() throws BeansException; }
实现类为 DefaultListableBeanFactory。
此外 Spring BeanFactory 的实现还有三个重要的实现类,功能以下:
AbstractBeanFactory
实现了 BeanFactory、 HierarchicalBeanFactory、ConfigurableBeanFactory 三个接口,最重要的方法是实现了 getBean(beanName) 接口,这个方法的最重要的步骤-建立 bean 则委托给模板方法 createBean 完成。
AbstractAutowireCapableBeanFactory
实现了 AutowireCapableBeanFactory 接口,也就是依赖注入。同时实现了 crcreateBean(beanName, mbd, args) 建立 bean 的三个重要过程:实例化(createBeanInstance)、依赖注入(populateBean)、初始化(initializeBean)。其中依赖注入又分为 autowireByName 和 autowireByType 二种,其中名称查找很简单,而类型查找就复杂了不少。Spring 将类型查找委托给了子类的 resolveDependency 完成。
DefaultListableBeanFactory
实现了 ConfigurableListableBeanFactory、BeanDefinitionRegistry 两个接口,提供了 Bean 和 BeanDefinition 查找注册的功能。 这个类一个很重要的功能是实现了模板方法 resolveDependency,这样就能够根据类型查找依赖。
天天用心记录一点点。内容也许不重要,但习惯很重要!