参考:
spring 源码分析及知识点总结
Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现
Spring的整体架构:
Spring的整体架构这些模块被总结为以下几个部分:
- Core Container
有Core、Beans、Context和EL模块(Expression Language)
Core和Beans模块是框架的基础部分,提供IoC(控制反转)和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置
Core模块:Spring框架基本的核心工具类
Beans模块:包含访问配置文件、创建和管理bean以及进行控制反转和依赖注入操作相关的所有类
Context模块:构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。为Spring核心提供了大量扩展
EL模块:提供了一个强大的表达式语言用于在运行时查询和操纵对象
-
Data Access/Integration
JDBC,数据访问交互,对象关系映射等 -
Web
建立Web上下文 -
AOP
AOP模块提供了一个标准的面向切面编程的实现,可以定义方法拦截器和切点,将逻辑代码分开,降低代码的耦合性,利用元数据功能,还可以将各种行为信息合并到代码中
- Test
支持使用Junit和TestNG对Spring组件进行测试
Spring概要
基本原理其实就是通过反射解析类及其类的各种信息,包括构造器、方法及其参数,属性。然后将其封装成bean定义信息类、constructor信息类、method信息类、property信息类,最终放在一个map里,也就是所谓的container,池等等,其实就是个map。
BeanFactory和BeanDefinition,一个是IOC的核心工厂接口,一个是IOC的bean定义接口,上章提到说我们无法让BeanFactory持有一个Map<String,BeanDefinition>来完成bean工厂的功能,是因为spring的初始化是可以控制的,可以到用的时候才将bean实例化供开发者使用,除非我们将bean的lazy-init属性设置为true,初始化bean工厂时采用延迟加载。
写好配置文件,启动项目后,框架会先按照配置文件找到对应的包,然后解析包里面的所有类,找到所有含有@bean,@service等注解的类,利用反射解析它们,包括解析构造器,方法,属性等等,然后封装成各种信息类放到一个map里。
每当你需要一个bean的时候,框架就会从container找是不是有这个类的定义啊?
如果找到则通过构造器new出来(这就是控制反转,不用你new,框架帮你new),再在这个类找需要注入的属性或者方法,比如标有@autowired的属性,如果有则还是到container找对应的解析类,new出对象,并通过之前解析出来的信息类找到setter方法,然后用该方法注入对象(这就是依赖注入)。
如果其中有一个类container里没找到,则抛出异常,比如常见的spring无法找到该类定义,无法wire的异常。
如果bean的scope是singleton,会重用。
如果scope是session,则该bean会放到session里面。
Spring bean作用域与生命周期
Spring通过new关键字将一个Bean进行实例化,Spring根据xml文件中的配置通过调用Bean中的setXXX方法填入对应的属性、事件通知。
Spring依次检查Bean是否实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean接口,如果有的话,依次调用这些接口使用。应用程序可以正常使用这个Bean了。销毁:如果Bean实现了DisposableBean接口,就调用其destroy方法。
BeanDefinition的载入和解析
对IoC容器来说,这个载入过程,相当于把定义的BeanDefinition在IoC容器中转化成一个Spring内部表示的数据结构的过程。IoC容器对Bean的管理和依赖注入功能的实现,是通过对其持有的BeanDefinition进行各种相关操作来完成的。这些BeanDefinition数据在IoC容器中通过一个HashMap来保持和维护。
Spring容器初始化过程
spring的IoC容器初始化包括:Bean定义资源文件的定位、载入和注册3个基本过程。
当 BeanDefinition 注册完毕以后, Spring Bean 工厂就可以随时根据需要进行实例化了。对于 XmlBeanFactory 来说,实例化默认是延迟进行的。
如何启动spring容器
在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener、ContextLoadServlet、ContextLoaderPlugin。
网友评论