一、一切从手动启动IoC容器开始

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

第一行代码:ClassPathResource的作用是起到了资源定位的作用。通常情况下,spring的配置信息使用文件来描述,通过这样一行代码,指明了需要加载的资源的位置,并且使用Spring能够理解的Resource接口的形式将资源描述出来。

第二行代码:DefaultListableBeanFactory是一个纯粹的IoC容器类,它是这个Spring的一个基础的IoC容器类,其他的一个IoC容器都是以这个类为基础进行扩展的。这样代码只是定义了一个IoC容器,它不具有任何其他的能力。

第三行代码:XmlBeanDefinitionReader是一个配置文件读取器。它实现了BeanDefinitionReader接口,它能够按照Spring配置文件,将其中的配置信息转换为spring内部可以识别的信息(BeanDefinition)。注意,在这里它的构造函数需要一个BeanDefinitionRegistry类型的参数,BeanDefinitionRegistry接口提供了一个回调函数,通过这个回调函数可以向IoC容器注册bean的定义信息。DefaultListableBeanFactory实现了这个接口。

第四行代码:调用loadeBeanDefinitions方法,通过给定的Resource资源,从中读取出spring的配置信息,转换为BeanDefinition,然后再调用BeanDefinitionRegistry的回调函数进行注册。

通过以上的四行代码,完成了spring容器的启动。

二、容器启动过程

1. 定位

在spring中,使用统一的资源表现方式Resource。根据不同的情况进行不同的选择。上述程序中,采用了编程式的资源定位方法,使用ClassPathResource定位位于classpath下的资源文件。

2. 加载

在加载这个过程中,主要工作是读取spring配置文件,解析配置文件中的内容,将这些信息转换成为Spring内容可以理解、使用的BeanDefinition。

3. 注册

加载过配置文件后,就将BeanDefinition信息注册到BeanDefinitionRegistry中,通常情况下Spring容器的实现类都实现这个接口。

最新文章

  1. TCP通信丢包原因总结
  2. android setVisibility失效不起作用的问题
  3. web安全之sql注入原理
  4. [Compose] 21. Apply Natural Transformations in everyday work
  5. MetInfo标签函数及参数
  6. 让backspace键默认为删除键
  7. ASP.NET——拒绝访问。 (异常来自HRESULT:0x80070005 (E_ACCESSDENIED))
  8. 黑马12期day01之html&css
  9. dedecms(织梦)自定义表单后台显示不全 自定义模型当中添加自定义字段后在后台添加内容后不显示解决方案
  10. jmx additional port
  11. 关于Spring事务<tx:annotation-driven/>的理解(Controller可以使用@Transactional)
  12. UOJ#75. 【UR #6】智商锁 随机化算法 矩阵树定理
  13. Django之auth模块
  14. PHP-问题处理Fatal error: Uncaught Error: Call to undefined function simplexml_load_file()
  15. springbootAdmin+eureka集群+swagger
  16. storm杂谈之Why use netty as transport instead of zeromq
  17. Spark学习笔记——在远程机器中运行WordCount
  18. Spring Aop 代理
  19. sql中同一个表一个字段的值赋值给另一个字段
  20. CodeForces 483B 二分答案

热门文章

  1. Hadoop Web项目--Friend Find系统
  2. x+=y与x=x+y相同吗?
  3. 从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化
  4. docker(三):Harbor 1.8.0 仓库的安装和使用
  5. wcf 学习程序
  6. 以SqlHelper为例论面向对象中封装的使用(续)
  7. Spring @Scheduled 注解 定时器例子
  8. javascript中经典继承的兼容写法
  9. Android 微信分享与QQ分享功能
  10. [ Java ] [ JUnit ] [ Eclipse ] coverage