核心容器(Spring Core)
核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。加入configuration注解使用bean注解加入容器,然后通过BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。
应用上下文(Spring Context)
1. spring context 是什么
在计算机系统中,进程执行时有进程上下文,如果进程在执行的过程中遇到了中断,CPU 会从用户态切换为内核态(当然这个过程用户进程是感知不到的,由硬件来实现的),此时进程处于的进程上下文会被切换到中断上下文中,从而可以根据中断号去执行相应的中断程序。进程在执行程序(不管是用户程序,还是内核中的中断程序)时,都会依赖一个上下文,这个上下文由多种数据结构组成,可以提供我们运行时需要的一些数据和保存运行时的一些数据。其实 spring context 就可以理解对一个程序运行时所需要的一些数据结构的抽象表达。
2. spring context 包括什么
主要包括:
DefaultListableBeanFactory
这就是大家常说的 ioc 容器,它里面有很多 map、list。spring 帮我们创建的 singleton 类型的 bean 就存放在其中一个 map 中。我们定义的监听器(ApplicationListener)也被放到一个 Set 集合中。
BeanDefinitionRegistry
把一个 BeanDefinition 放到 beanDefinitionMap。
AnnotatedBeanDefinitionReader
针对 AnnotationConfigApplicationContext 而言。一个 BeanDefinition 读取器。
扩展点集合
存放 spring 扩展点(主要是 BeanFactoryPostProcessor、BeanPostProcessor)接口的 list 集合。
3. spring context 的生命周期
下面大家可以结合代码这段代码去理解 spring context 的生命周期。
public static void main(String[] args) {
// 初始化和启动
AnnotationConfigApplicationContext acaContext = new AnnotationConfigApplicationContext(AppConfig.class);
// 运行
acaContext.getBean(ServiceA.class);
// 关闭/销毁
acaContext.close();
}
3.1 初始化和启动
我们平时常说的spring 启动其实就是调用 AbstractApplicationContext#refresh 完成 spring context 的初始化和启动过程。spring context 初始化从开始到最后结束以及启动,这整个过程都在 refresh 这个方法中。refresh 方法刚开始做的是一些 spring context 的准备工作,也就是 spring context 的初始化,比如:创建 BeanFactory、注册 BeanFactoryPostProcessor 等,只有等这些准备工作做好以后才去开始 spring context 的启动。
你可以把初始化理解为准备原料(对应到编程中就是创建好一些数据结构,并为这些数据结构填充点数据进去),等准备了你才能去真正造玩偶、造东西呀(对应到编程中就是执行算法)。在编程中数据结构与算法是分不开的也是这个道理呀,它们相互依赖并没有严格的界限划分。
3.2 运行
spring context 启动后可以提供它的服务的这段时间。
3.3 关闭/销毁
不需要用 spring context ,关闭它时,其实对应到代码上就是 acaContext.close();
Spring面向切面编程(Spring AOP)
目标对象(操作过程),还有横切面对象(验证,上下文,日志)是分开的,然后一个业务流程由目标对象与横切面对象组成,比如说登录流程,首先是应用初始化,然后是验证,然后是成功与失败的判定,然后是对应的结果,这个过程中用户对象,验证对象,以及配置对象是分离的而整个流程是一个整体。
JDBC和DAO模块(Spring DAO)
JDBC、DAO的Java数据库连接与数据处理,可用该结构来管理数据的异常处理,以及操作抛出的错误信息。使用DataSource实现对连接池的管理,getConnection获取一个连接对象,然后进行相关的数据操作。
对象实体映射(Spring ORM)
Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具,其中比较常用的有Hibernate、Mybatis等,所有这些都遵从Spring的通用事物和DAO异常层次结构。常用连接源(driver、dhcp、c3p0、jndi等),相关步骤:
装载相应的数据库的JDBC驱动并进行初始化
建立JDBC和数据库之间的Connection连接
创建对象,执行SQL语句
处理和显示结果
释放资源
Web模块(Spring Web)
Web上下文模块建立在应用程序上下文模块之上,提供了Servlet过滤器(webfilter),为基于web的应用程序提供了上下文。大部分工作是请求以及将请求参数绑定到域对象。各种请求处理。
MVC模块(Spring Web MVC)
一个基于web开发的MVC框架,业务逻辑从页面分离后,文件蜕变成一个单纯完成显示任务的东西,这就是常说的View,而独立出来的事务逻辑变成人们常说的Model,再加上控制器Control本身,就构成了MVC。