引言
在Spring中,认为一切Java类都是资源,而资源就是Bean,容纳这些Bean的就是IoC容器
Spring的作用
Spring的作用主要有以下几点:
1、提供轻量级和低侵入的编程,可以通过配置(XML、注解) 来扩展POJO的功能,
通过依赖注入去扩展功能,降低系统耦合度。
2、提供切面编程,尤其是将数据库应用通过切面消除了以前复杂的try catch代码结构
3、提供模板类去整个MyBatis、Redis等其他框架。
IoC (控制反转)
IoC是一种通过描述(XML或者注解) 然后通过第三方去获取特定对象的方式。
IoC的概念就是让对象的生成不需要程序员自己完成。当需要一个对象的时候,通过IoC容器的getBean方法即可获取对象,而不是自己去创建。
IoC容器
IoC容器的设计主要是基于BeanFactory和ApplicationContext两个接口,BeanFactory是IoC的最底层接口。
所谓的IoC容器就是一个Map,key是类,value是类的实例。
Spring Bean 的生命周期
Bean的加载过程 (如何加载到IoC容器中)
Bean的加载过程就是:
从xml读取bean的信息加载到Spring容器中,通过xml配置的id从Spring容器反射得到这个类的实例对象。
1.获取配置文件资源.
Resource resource = new ClassPathResource(“xml”);
Resource接口将各种底层资源File资源、Classpath下的资源、URL资源、InputStream资源、Byte数组资源抽象化了。
2.对获取的xml资源进行一定的处理检验
(1)通过类加载器注入DefaultListableBeanFactory对象
(2)执行XmlBeanFactory的构造方法,其中把配置文件Resource传给他
(3)XmlBeanFactory委托XmlBeanDefinitionReader对Resource执行loadBeanDefinitions(resource),而在loadBeanDefinitions()中,reader将resource向下转型为EncodedResource,并对资源进行一定封装。
3.处理包装资源并解析
(1)reader将资源传入核心处理部分doLoadBeanDefinitions(inputSource, encodedResource.getResource()); 这一步做了关键的3步:
1)获取XML文件的验证模式(DTD或者XSD)
2)加载XML并得到Document
3)根据Document解析并注册BeanDefinition( doRegisterBeanDefinitions() )
4.加载提取bean并实例化(添加到beanDefinitionMap中)
(1)将getBean()方法的参数进行解析转换
(2)尝试从缓存中加载单例
单例在同一个容器中只创建一次,后续再获取bean直接从单例缓存中取,获取bean的过程是从底层map中获取,底层map的key是BeanName,value是bean实例。
(3)bean的实例化
如果从缓存中得到了bean的原始状态,就对bean实例化