以下文章来源于微信公众号,作者sowhat1412
1 Spring核心组件
一句话概括:Spring是一个轻量级、非入侵式的控制反转(IoC)和面向切面(AOP)的框架。
Spring 版本 | JDK版本 |
---|---|
1.x | 1.3:引入了动态代理机制,AOP 底层就是动态代理。 |
2.x | 1.4:正常升级 |
3.x | 5:引入注解,Spring 3 最低版本是 Java 5 ,从此以后不叫1.x 直接叫x |
4.x | 6:划时代意义的版本,开始支持 Spring Boot 1.X |
5.x | 8:lambda 表达式等功能 |
PS :目前Java 开发的标配是 Spring5 + Spring Boot 2 + JDK 8
1.1 Spring 简介
现如今的Java开发又简称为Spring开发,Spring是Java目前第一大框架,它让现有的技术更容易使用,促进良好的编程习惯,大大简化应用程序的开发。
因为你想啊,如果我们想实现某个功能,代码量一般都是固定的,要么全自己写,要么用已有的优秀框架,而Spring不仅已经给我们提供了各种优秀组件,还提供了良好的代码组织逻辑跟业务开发流程规范框架,它的主要优点如下:
-
IOC跟DI的支持
Spring就是一个大工厂容器,可以将所有对象创建和依赖关系维护,交给Spring管理,Spring工厂是用于生成Bean,并且管理Bean的生命周期,实现高内聚低耦合的设计理念。
-
AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
-
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程,以前重复的一些JDBC操作,统统不需我们再写了。
-
方便程序的测试
Spring对Junit4提供支持,可以通过注解方便的测试Spring程序。
-
粘合剂功能
方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持。
-
降低 JavaEE API的使用难度
Spring 对 JavaEE 开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都提供了封装,这些API的提供使得应用难度大大降低。
1.2 Spring组件
Spring框架是分模块存在,除了最核心的Spring Core Container
是必要模块之外,其他模块都是可选
,大约有20多个模块。
Spring框架 有很多特性,这些特性由7个定义良好的模块构成。
Spring Core:Spring核心,它是框架最基础的部分,提供IOC和依赖注入DI特性。
Spring Context:Spring上下文容器,它是 BeanFactory 功能加强的一个子接口。
Spring Web:它提供Web应用开发的支持。
Spring MVC:它针对Web应用中MVC思想的实现。
Spring DAO:提供对JDBC抽象层,简化了JDBC编码,同时,编码更具有健壮性。
Spring ORM:它支持用于流行的ORM框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO的整合等。
Spring AOP:即面向切面编程,它提供了与AOP联盟兼容的编程实现。
2 IOC 跟 AOP
提到Spring永远离不开的两个话题就是 IOC跟AOP,这是Spring的两大核心知识点,初学者不要被IOC、AOP、Aspect、Pointcut、Advisor这些术语吓着了,这些术语都是无聊的人为了发论文硬造的。
2.1 IOC
Java是个面向对象的编程语言,一般一个应用程序是由一组对象通过相互协作开发出的业务逻辑组成的,那么如何管理这些对象呢?抽象工厂、工厂方法设计模式可以帮我们创建对象,生成器模式帮我们处理对象间的依赖关系,可是这些又需要我们创建另一些工厂类、生成器类,我们又要而外管理这些类,增加了我们的负担。如果程序在对象需要的时候,就能自动管理对象的声明周期,不用我们自己再去管理Bean的声明周期了,这样不就实现解耦了么。
Spring提出了一种思想:由Spring
来负责控制对象的生命周期和对象间的关系。所有的类都会在Spring容器中登记,告诉Spring这
这个类是什么,需要什么,然后Spring会在系统运行到适当的时候,把你要的东西主动
给你,同时也把你交给其他
需要你的Bean。所有的类的创建、销毁都由Spring
来控制,也就是说控制对象生存周期的不再是引用它的对象,而是Spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转(Inversion of Controller),也可以叫依赖注入 DI(Dependency Injection)。
知道大致思想后其实可以如果尝试 自己实现IOC 的话就会发现核心就是 反射 + XML解析/注解解析 。
读取 XML 获取 bean 相关信息,类信息、属性值信息。
通过
反射机制
获取到目标类的构造函数,调用构造函数,再给对象赋值。
如果想自己跟下源码你会发现IOC的源码入口是refresh()
,里面包含13个提供不同功能的函数,具体流程较复杂,公众号回复 IOC 获得原图。
2.2 Context
IOC 容器只是提供一个管理对象的空间而已,如何向容器中放入我们需要容器代为管理的对象呢?这就涉及到Spring的应用上下文Context。
应用上下文Context :
基于 Core 和 Beans,提供了大量的扩展,包括国际化操作(基于 JDK )、资源加载(基于 JDK properties)、数据校验(Spring 自己封装的数据校验机制)、数据绑定(Spring 特有,HTTP 请求中的参数直接映射称 POJO)、类型转换,ApplicationContext 接口是 Context 的核心,可以理解为Bean的上下文或背景信息。
可以简单的理解 应用上下文 是Spring容器的一种抽象化表述,而我们常见的 ApplicationContext 本质上就是一个维护Bean定义以及对象之间协作关系的高级接口。Spring 框架本身就提供了很多个容器的实现,大概分为两种类型:
-
一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能。
-
另外一种就是继承了BeanFactory后派生而来的应用上下文,其抽象接口也就是我们上面提到的的ApplicationContext,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景。有了上下文对象,我们就能向容器注册需要Spring管理的对象了。对于上下文抽象接口,Spring也为我们提供了多种类型的容器实现,供我们在不同的应用场景选择。
AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式。
ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式。
FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件。
AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式。
XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。
工作中通过XML配置或注解 将需要管理的Bean跟Bean之间的协作关系配置好,然后利用应用上下文对象Context加载进Spring容器,容器就能为你的程序提供你想要的对象管理服务了。比如追踪下 ClassPathXmlApplicationContext 的底层源码: