你的位置:首页 > 软件开发 > Java > Spring IOC容器源码浅析

Spring IOC容器源码浅析

发布时间:2016-04-22 21:00:07
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找。依赖注入应用比 ...

     控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找。依赖注入应用比较广泛。把控制权从具体的对象手中交给平台或者是框架。

2 BeanFactory是基本的功能接口

public interface BeanFactory {  //这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,  //如果需要得到工厂本身,需要转义      String FACTORY_BEAN_PREFIX = "&";  //这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。  Object getBean(String name) throws BeansException;  //这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根据名字取得的bean实例的Class类型和需要的不同的话。  Object getBean(String name, Class requiredType) throws BeansException;  //这里提供对bean的检索,看看是否在IOC容器有这个名字的bean  boolean containsBean(String name);  //这里根据bean名字得到bean实例,并同时判断这个bean是不是单件  boolean isSingleton(String name) throws NoSuchBeanDefinitionException;  //这里对得到bean实例的Class类型  Class getType(String name) throws NoSuchBeanDefinitionException;  //这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来  String[] getAliases(String name);}
  • 创建IOC配置文件的抽象资源
  • 创建一个BeanFactory
  •  

public class extends DefaultListableBeanFactory {  //这里为容器定义了一个默认使用的bean定义读取器  private final new this);  public throws BeansException {    this(resource, null);  }  //在初始化函数中使用读取器来对资源进行读取,得到bean定义信息。  public throws BeansException {    super(parentBeanFactory);    this.reader.loadBeanDefinitions(resource);  }

ApplicationContext

  ApplicationContext = new FileSystem

      继承Messagesource,可以支持不同的信息源

      访问资源,ResourceLoader和Resource,可以从不同的地方来获取Bean的定义资源

      支持应用事件,继承了ApplicationEvnetPublisher接口

     ApplicationContext允许上下文嵌套 - 通过保持父上下文可以维持一个上下文体系 - 这个体系我们在以后对Web容器中的上下文环境的分析中可以清楚地看到。对于bean的查找可以在这个上下文体系中发生,首先检查当前上下文,其次是父上下文,逐级向上,这样为不同的Spring应用提供了一个共享的bean定义环境。这个我们在分析Web容器中的上下文环境时也能看到。

     refresh的模板在AbstractApplicationContext:refresh的模板在AbstractApplicationContext:refresh的模板在AbstractApplicationContext:

  public void refresh() throws BeansException, IllegalStateException {    synchronized (this.startupShutdownMonitor) {      synchronized (this.activeMonitor) {        this.active = true;      }      // 这里需要子类来协助完成资源位置定义,bean载入和向IOC容器注册的过程      refreshBeanFactory();      ............   }

     这个方法包含了整个BeanFactory初始化的过程,对于特定的FileSystem

在Abstract

  protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {    // 这里使用    new //这里配置reader的环境,其中ResourceLoader是我们用来定位bean定义信息资源位置的    ///因为上下文本身实现了ResourceLoader接口,所以可以直接把上下文作为ResourceLoader传递给    beanDefinitionReader.setResourceLoader(this);    beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));    initBeanDefinitionReader(beanDefinitionReader);    //这里转到定义好的    loadBeanDefinitions(beanDefinitionReader);  

     转到beanDefinitionReader中进行处理:

  protected void loadBeanDefinitions(throws BeansException, IOException {    Resource[] configResources = getConfigResources();    if (configResources != null) {      //调用      reader.loadBeanDefinitions(configResources);    }    String[] configLocations = getConfigLocations();    if (configLocations != null) {      reader.loadBeanDefinitions(configLocations);    }  }

     而在作为其抽象父类的AbstractBeanDefinitionReader中来定义载入过程:

  public int loadBeanDefinitions(String location) throws BeanDefinitionStoreException {   //这里得到当前定义的ResourceLoader,默认的我们使用DefaultResourceLoader   ResourceLoader resourceLoader = getResourceLoader();   .........//如果没有找到我们需要的ResourceLoader,直接抛出异常    if (resourceLoader instanceof ResourcePatternResolver) {      // 这里处理我们在定义位置时使用的各种pattern,需要ResourcePatternResolver来完成      try {        Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);        int loadCount = loadBeanDefinitions(resources);        return loadCount;      }     ........    }    else {      // 这里通过ResourceLoader来完成位置定位      Resource resource = resourceLoader.getResource(location);      // 这里已经把一个位置定义转化为Resource接口,可以供      int loadCount = loadBeanDefinitions(resource);      return loadCount;    }  }

原标题:Spring IOC容器源码浅析

关键词:Spring

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录