Spring源码解析之路 结构篇

148 阅读2分钟

Spring十分庞大,里面用了很多设计模式,而且编程几度风雨Spring却像一个不老顽童一样,现在就开启Spring源码分析之旅,这一篇主要写Spring的组成及其结构以及各个类的职责介绍

Spring两大核心类

一 DefaultListableBeanFactory

image.png

  • DefaultListableBeanFactory

DefaultListableBeanFactory是整个bean加载的核心部分,包含了所有的bean信息,XmlBeanFactory继承了他,不同的是XmlBeanFactory使用了个性化的XmlBeanDefinitionReader来读取配置文件

   public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader = new XmlBeanDefinitionReader(this);
        this.reader.loadBeanDefinitions(resource);
    }
    
  • AliasRegistry

    定义对Alias的简单的增删改查的操作,alias就是别名,比如map.put("Yanglele",Yanglele.class); 在容器里面Yanglele就是Yanglele.class的别名

    public interface AliasRegistry {
         void registerAlias(String var1, String var2);
    
         void removeAlias(String var1);
    
         boolean isAlias(String var1);
    
         String[] getAliases(String var1);
     }
    
  • SimpleAliasRegistry

      public class SimpleAliasRegistry implements AliasRegistry {
         protected final Log logger = LogFactory.getLog(this.getClass());
         private final Map<String, String> aliasMap = new ConcurrentHashMap(16);
         
         -----
    

    主要使用map作为alias的缓存,并对AliasRegistry进行实现

  • BeanDefinitionRegistry

     public interface BeanDefinitionRegistry extends AliasRegistry {
         void registerBeanDefinition(String var1, BeanDefinition var2) throws BeanDefinitionStoreException;
    
         void removeBeanDefinition(String var1) throws NoSuchBeanDefinitionException;
    
         BeanDefinition getBeanDefinition(String var1) throws NoSuchBeanDefinitionException;
    

    定义对BeanDefinition各种的增删改查的操作

  • SingletonBeanRegistry

    定义对单例的注册和获取

     public interface SingletonBeanRegistry {
          void registerSingleton(String var1, Object var2);
    
          @Nullable
          Object getSingleton(String var1);
    
          boolean containsSingleton(String var1);
    
          String[] getSingletonNames();
    
          int getSingletonCount();
    
          Object getSingletonMutex();
      }
    
  • DefaultSingletonBeanRegistry

    对接口SingletonBeanRegistry中函数的实现

      public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
          private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;
          private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
          private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
          private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
    
  • FactoryBeanRegistrySupport

在DefaultSingletonBeanRegistry基础上增加了对FactoryBean特殊功能处理

  • BeanFactory

      public interface BeanFactory {
          String FACTORY_BEAN_PREFIX = "&";
    
          Object getBean(String var1) throws BeansException;
    
          <T> T getBean(String var1, Class<T> var2) throws BeansException;
          --------
    

    定义获取Bean和Bean的各种属性

  • HierarchicalBeanFactory

     public interface HierarchicalBeanFactory extends BeanFactory {
          @Nullable
          BeanFactory getParentBeanFactory();
    
          boolean containsLocalBean(String var1);
     }
    

    继承了BeanFactory,在BeanFactory基础上增加了对parentFactory的支持(Hierarchical译为分层的)

    二 XmlBeanDefinitionReader

    XmlBeanFactory继承了他,不同的是XmlBeanFactory使用了个性化的XmlBeanDefinitionReader来读取配置文件

    image.png

  • EnvironmentCapable

    定义获取Environment方法

  • BeanDefinitionReader 定义资源文件读取并转化为BeanDefinition

       public interface BeanDefinitionReader {
        BeanDefinitionRegistry getRegistry();
    
        @Nullable
        ResourceLoader getResourceLoader();
    
        @Nullable
        ClassLoader getBeanClassLoader();
        ------
    
  • AbstractBeanDefinitionReader

    对BeanDefinitionReader和EnvironmentCapable中的方法进行实现

      public abstract class AbstractBeanDefinitionReader 
      implements BeanDefinitionReader, EnvironmentCapable {
         protected final Log logger = LogFactory.getLog(this.getClass());