spring3.2.6源码解析之spring-beans

spring

spring框架包含的主体包含八大部分,分别是:
spring-BEANS, spring-CORE, spring-CONTEXT , spirng-AOP , spirng-ORM, spring-DAO , spring-WEB , spring-WEB-MVC
spring3.2.6源码解析之spring-beans

spring-beans

主要实现了IOC容器,对bean的全生命周期就行管理,创建,保存,销毁对象,以及依赖注入.
ConfigurableListableBeanFactory接口继承了以上所有的接口
DefaultListableBeanFactory类实现了ConfigurableListableBeanFactory接口
下面来详细介绍

  1. BeanFactory
  2. AutowireCapableBeanFactory
  3. HierarchicalBeanFactory
  4. ListableBeanFactory
  5. ConfigurableBeanFactory
  6. ConfigurableListableBeanFactory

spring3.2.6源码解析之spring-beans

  1. BeanFactory
    BeanFactory是Spring bean容器的根接口.
    每个bean都是通过string类型bean name进行标识.这边提供了设计模式单例,原型的替代实现.
    如果bean name配置为单例,应用内只会获取到一个实例.如果配置为原型,那么可以实例化好后填充属性(基于用户的配置).
    BeanFactory作为应用集中配置管理的地方,极大简便应用开发,这样开发人员可以集中与业务.
    BeanFactory需要管理bean的生命周期,比如初始化时需要按顺序实现如下接口:
      1. BeanNameAware’s {@code setBeanName}
      2. BeanClassLoaderAware’s {@code setBeanClassLoader}
      3. BeanFactoryAware’s {@code setBeanFactory}
      4. ResourceLoaderAware’s {@code setResourceLoader}仅对application context有效
      5. ApplicationEventPublisherAware’s {@code setApplicationEventPublisher}仅对application context有效
      6. MessageSourceAware’s {@code setMessageSource}仅对application context有效
      7. ApplicationContextAware’s {@code setApplicationContext}仅对application context有效
      8. ServletContextAware’s {@code setServletContext}仅对application context有效
      9. {@code postProcessBeforeInitialization} methods of BeanPostProcessors
      10. InitializingBean’s {@code afterPropertiesSet}
      11. a custom init-method definition xml中配置的init-method
      12. {@code postProcessAfterInitialization} methods of BeanPostProcessors
    还有关闭容器的接口:
      1. DisposableBean’s {@code destroy}
      2. a custom destroy-method definition xml配置中的destroy-method
    接口里定义了一个变量String FACTORY_BEAN_PREFIX = “&”;
      这是用来区分是获取FactoryBean还是FactoryBean的createBean创建的实例.如果&开始则获取FactoryBean;否则获取createBean创建的实例.
    我们来看下定义的方法:
      a, 获取bean,这边可以实现单例,原型
        Object getBean(String name) throws BeansException; 可以用别名查找
         T getBean(String name, Class requiredType) throws BeansException;
         T getBean(Class requiredType) throws BeansException; 这边的类型可以是接口或者子类,但不能是null
        Object getBean(String name, Object… args) throws BeansException;
      b, 判断是否包含bean.陷阱出现:这边不管类是否抽象类,懒加载,是否在容器范围内,只要符合都返回true,所以这边true,不一定能从getBean获取实例
        boolean containsBean(String name);
      c, 单例,原型,bean类型的判断
        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
        boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
        boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
      d, 获取bean 的类型,别名
        Class<?> getType(String name) throws NoSuchBeanDefinitionException;
        String[] getAliases(String name);

  1. AutowireCapableBeanFactory

在BeanFactory基础上实现对已存在实例的管理.
可以使用这个接口集成其它框架,捆绑并填充并不由Spring管理生命周期并已存在的实例.像集成WebWork的Actions 和Tapestry Page就很实用.
一般应用开发者不会使用这个接口,所以像ApplicationContext这样的外观实现类不会实现这个接口,如果真手痒痒可以通过ApplicationContext的getAutowireCapableBeanFactory接口获取.
这边定义了5种自动装配策略:不注入AUTOWIRE_NO,使用bean name策略装配AUTOWIRE_BY_NAME,使用类型装配策略AUTOWIRE_BY_TYPE,使用构造器装配策略AUTOWIRE_CONSTRUCTOR,自动装配策略AUTOWIRE_AUTODETECT
  这边的自动策略是先尝试构造器,然后才是byType.这边应该是跟xml配置文件中的装配策略对应.
继续看定义的api:
  a, 创建和填充外部bean实例的典型方法
     T createBean(Class beanClass) throws BeansException;
    void autowireBean(Object existingBean) throws BeansException; // 使用autowireBeanProperties装配属性
    Object configureBean(Object existingBean, String beanName) throws BeansException; // 自动装配属性,填充属性值,使用诸如setBeanName,setBeanFactory这样的工厂回调填充属性,最好还要调用post processor
    Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;
  b, 在bean的生命周期进行细粒度控制的专门方法
    Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; // 会执行bean完整的初始化,包括BeanPostProcessors和initializeBean
    Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
    void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException;
    void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
    Object initializeBean(Object existingBean, String beanName) throws BeansException;
    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;
    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
    Object resolveDependency(DependencyDescriptor descriptor, String beanName, Set autowiredBeanNames, TypeConverter typeConverter) throws BeansException;


  1. HierarchicalBeanFactory
    提供父容器的访问功能.至于父容器的设置,需要找ConfigurableBeanFactory的setParentBeanFactory(接口把设置跟获取给拆开了!).
    直接上api:
      a, 获取父容器 bean factory
        BeanFactory getParentBeanFactory();
      b, 判断当前容器是否保护bean
        boolean containsLocalBean(String name);

  1. ListableBeanFactory
    获取bean时,Spring 鼓励使用这个接口定义的api. 还有个Beanfactory方便使用.其他的4个接口都是不鼓励使用的.
    提供容器中bean迭代的功能,不再需要一个个bean地查找.比如可以一次获取全部的bean(太暴力了),根据类型获取bean.在看SpringMVC时,扫描包路径下的具体实现策略就是使用的这种方式(那边使用的是BeanFactoryUtils封装的api).
      a, 暴力获取全部bean的属性:
        boolean containsBeanDefinition(String beanName); //是否包含bean
        int getBeanDefinitionCount(); // 当前factory中定义的bean数量
        String[] getBeanDefinitionNames(); // 获取当前工厂中定义的所有bean 的name
      b, 根据bean 的类型获取bean
        这边的方法仅检查*bean.它不会检查嵌套的bean.FactoryBean创建的bean会匹配为FactoryBean而不是原始类型.
        一样不会考虑父factory中的bean,非要用可以通过BeanFactoryUtils中的beanNamesForTypeIncludingAncestors.
        其他方式注册的单例这边会纳入判断.
        这个版本的getBeanNamesForType会匹配所有类型的bean,包括单例,原型,FactoryBean.返回的bean names会根据backend 配置的进行排序.
        String[] getBeanNamesForType(Class<?> type); // 获取给定类型的bean names(包括子类),通过bean 定义或者FactoryBean的getObjectType判断.
        String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
         Map<String, T> getBeansOfType(Class type) throws BeansException; // 如果保护懒加载的类,FactoryBean初始化的类和工厂方法初始化的类会被初始化.就是说执行这个方法会执行对应的初始化.
         Map<String, T> getBeansOfType(Class type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException;
      c, 查找使用注解的类
        Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
      d, 查找一个类上的注解,如果找不到,父类,接口使用注解也算.
        A findAnnotationOnBean(String beanName, Class annotationType);

  1. ConfigurableBeanFactory
    定义BeanFactory的配置.
    这边定义了太多的api,比如类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系,合并其他ConfigurableBeanFactory,bean如何销毁.
    定义了两个作用域: 单例和原型.可以通过registerScope来添加.
      SCOPE_SINGLETON,SCOPE_PROTOTYPE
    a, 父容器设置.而且一旦设置了就不让修改
        void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
      b, 类加载器设置与获取.默认使用当前线程中的类加载器
        void setBeanClassLoader(ClassLoader beanClassLoader);
        ClassLoader getBeanClassLoader();
      c, 为了类型匹配,搞个临时类加载器.好在一般情况为null,使用上面定义的标准加载器  
        void setTempClassLoader(ClassLoader tempClassLoader);
        ClassLoader getTempClassLoader();
      d, 是否需要缓存bean metadata,比如bean difinition 和 解析好的classes.默认开启缓存
        void setCacheBeanMetadata(boolean cacheBeanMetadata);
        boolean isCacheBeanMetadata();
      e, 定义用于解析bean definition的表达式解析器
        void setBeanExpressionResolver(BeanExpressionResolver resolver);
        BeanExpressionResolver getBeanExpressionResolver();
      f, 类型转化器
        void setConversionService(ConversionService conversionService);
        ConversionService getConversionService();
      g, 属性编辑器
        void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
        void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
        void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
      h, BeanFactory用来转换bean属性值或者参数值的自定义转换器
        void setTypeConverter(TypeConverter typeConverter);
        TypeConverter getTypeConverter();
      i,string值解析器(想起mvc中的ArgumentResolver了)
        void addEmbeddedValueResolver(StringValueResolver valueResolver);
        String resolveEmbeddedValue(String value);
      j,BeanPostProcessor用于增强bean初始化功能
        void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
        int getBeanPostProcessorCount();    
      k,作用域定义
        void registerScope(String scopeName, Scope scope);
        String[] getRegisteredScopeNames();
        Scope getRegisteredScope(String scopeName);
      l,访问权限控制
        AccessControlContext getAccessControlContext();
      m, 合并其他ConfigurableBeanFactory的配置,包括上面说到的BeanPostProcessor,作用域等
        void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
      n, bean定义处理
        void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; // 注册别名
        void resolveAliases(StringValueResolver valueResolver);
        BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // 合并bean定义,包括父容器的
        boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; // 是否是FactoryBean类型
      o, bean创建状态控制.在解决循环依赖时有使用
        void setCurrentlyInCreation(String beanName, boolean inCreation);
        boolean isCurrentlyInCreation(String beanName);
      p, 处理bean依赖问题
        void registerDependentBean(String beanName, String dependentBeanName);
        String[] getDependentBeans(String beanName);
        String[] getDependenciesForBean(String beanName);
      q, bean生命周期管理-- 销毁bean
        void destroyBean(String beanName, Object beanInstance);
        void destroyScopedBean(String beanName);
        void destroySingletons();

  1. ConfigurableListableBeanFactory
    提供bean definition的解析,注册功能,再对单例来个预加载(解决循环依赖问题).
      a, 设置忽略的依赖关系,注册找到的特殊依赖
        void ignoreDependencyType(Class<?> type); // 忽略类型
        void ignoreDependencyInterface(Class<?> ifc); // 忽略接口
        void registerResolvableDependency(Class<?> dependencyType, Object autowiredValue);
        boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;
      b, 获取bean定义 (可以访问属性值跟构造方法的参数值)
        BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
      c, 锁定配置信息.在调用refresh时会使用到.
        void freezeConfiguration();
        boolean isConfigurationFrozen();
      d, 预加载不是懒加载的单例.用于解决循环依赖问题
        void preInstantiateSingletons() throws BeansException;

applicaitonContext
spring3.2.6源码解析之spring-beans