1 SpringIOC 初始化总结

1 SpringIOC 初始化总结

1 IOC容器的初始化步骤

  • Resource资源定位
    • 定位Bean的资源
  • BeanDefinition的载入和解析
    • BeanDeginitionReader 对Resource资源的读取和解析,也就是将用户定义的Bean 表示成IOC容器内部数据结构,BeanDefinition 在IOC容器内维护这一个BeanDefinition Map的数据结构
  • BeanDefinition的注册
    • 向IOC容器注册在第二部解析好的BeanDefinition, 通过BeanDefinitionRegistery 接口实现,IOC容器通过一个HashMap来装载第二步中解析得到的BeanDefinition,但是此时并没有完成依赖注入,而是在第一次调用getBean()的时候

实际代码

ClassPathResource resource = new ClassPathResource("bean.xml");DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);reader.loadBeanDefinitions(resource);

这几行代码都是什么意义呢

  • ClassPathResource resource = new ClassPathResource("bean.xml"); 根据xml文件创建Resource资源对象,其中ClassPathResource是Resource的子类
  • DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); 创建一个BeanFactory, DefaultListableBeanFactory 是BeanFactory的一个子类,是IOC的始祖

* XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); 创建一个读取器,用于载入BeanDefinition* reader.loadBeanDefinitions(resource);开始载入和注册bean,完成后放入IOC容器中

3 Resource定位

为了解决资源定位的问题,Spring提供了2个接口

  • Resource ,spring的统一资源抽象接口
  • ResourceLoader, spring的 资源加载的统一抽象

需要注意的是 Resource 和 ResourceLoader 需要配合使用,比如上面那段代码是合适初始化ResourceLoader呢?我们看看XmlBeanDefinitionReader的 构造方法

  public XmlBeanDefinitionReader(BeanDefinitionRegistry registry) {        super(registry);    }

发现是调用父类的构造方法,继续追踪到 AbstractBeanDefinitionReader

protected AbstractBeanDefinitionReader(BeanDefinitionRegistry registry) {        Assert.notNull(registry, "BeanDefinitionRegistry must not be null");        this.registry = registry;        // Determine ResourceLoader to use.        if (this.registry instanceof ResourceLoader) {            this.resourceLoader = (ResourceLoader) this.registry;        }        else {            this.resourceLoader = new PathMatchingResourcePatternResolver();        }        // Inherit Environment if possible        if (this.registry instanceof EnvironmentCapable) {            this.environment = ((EnvironmentCapable) this.registry).getEnvironment();        }        else {            this.environment = new StandardEnvironment();        }    }

如果设置了ResourceLoader,就使用设置的,否则使用PathMathingResourcePatternResolver

4 BeanDefinition的载入和解析

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部