一:什么是Spring?
Spring就是春天的意思。由Rod Johnson创建。从起名来看,就能看出他当初创建时的宏图。而事实他也做到了,为java开源世界带来了如春天般的百花绽放。如今的Spring已经成为java应用首选的full-stack开发框架,对传统的EJB重量型框架的思想进行了颠覆性的革新,通过Rod Johnson天才般的演绎,使Spring在短时间内成为用户众多,社群庞大,文档丰富,众多的应用案例的开源框架。
概括来说:Spring是分层的Java SE/EE应用一站式的轻量级开源框架,以IoC(Inverse of Control,控制反转) 和 AOP(Aspect Oriented Programming,切面编程)为内核,提供了展现层 Spring MVC,持久层 Spring JDBC 及业务层事务管理等一站式企业级应用技术。而且Spring以海纳百川的胸怀整合了开源世界的众多著名的第三方框架和类库,成为使用最多的轻量级Java EE企业应用开源框架
Spring4开始全面支持JavaSE 8,JavaEE7,并向下兼容JavaSE6/JavaEE6,新增如:泛型依赖注入,Lambda表达式的支持,Groovy DSL 定义Bean,核心容器增强,Web框架增强,WebSocket模块的实现,测试的增强,全面支持REST风格的Web开发。。Spring的子项目更是丰富多彩,支持产品化开发,大数据,云计算,微服务架构,Mobile等引领世界风潮的技术
二:Spring给我们带来了什么?
EJB的复杂来源于它对所有的企业应用采用了统一的标准,为所有企业都统一了分布式对象,远程事务,因此造就了EJB框架的极度复杂。看上去EJB让用户不用了解远程调用细节。但是用于其复杂度造成了学习成本高,排错复杂,且EJB测试复杂,测试不能脱离EJB容器,每次测试需要部署启动EJB容器。造成排错周期长。。但是EJB是分布式应用和复杂的事务管理问题的一个不错的选择。但由于EJB统一的标准,对于一些用不到复杂分布式应用和事务管理的应用就显得过于复杂和臃肿。
Spring出发点就是轻便,简洁。带来了好处:
1:方便解耦,简化开发。通过IoC容器,将对象之间的依赖由Spring容器控制,避免硬编码的耦合。
2:AOP编程的支持:通过AOP(面向切面编程)进行切免编程。可以实现轻松实现OOP(面向对象编程)难以实现一些功能,如:日志,
3:声明式事务支持。灵活,效率
4:程序测试方便:可以用非容器依赖的编程方式进行几乎所有的测试工作
5:方便集成各种优秀的框架。而且降低了各种优秀框架的使用难度
6:降低Java EE API的难度,Spring对一些复杂的API进行了薄层封装
7:Spring的源码设计精妙,结构清晰,是最佳的实例范例
三:Spring的体系结构
上图是Spring 5的模块结构图,而这些组件被分别整合在核心容器(Core Container)、AOP(Aspect Oriented Programming)、设备支持(Instrument)、数据访问及集成(Data Access/Integratioin)、Web、报文发送(Messaging)、Test等模块。
1.核心容器:由spring-beans, spring-core, spring-context和spring-expression 4个模块组成。
(1)spring-core:控制反转IoC(Inversion of Control)与依赖注入DI(Dependency Injection)的基本实现,控制反转是种设计思想,将类与类之间的依赖从代码中脱离,用配置的方式进行依赖关系描述,由IoC容器负责类之间的创建,拼接,管理,获取等工作。
(2)spring-beans:Bean工厂与bean的装配,BeanFactory接口使用控制反转对应用程序的配置、依赖性规范与实际的应用程序代码进行分离。但是BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。
(3)spring-context:spring的context上下文,即IoC容器,它扩展了BeanFactory,为它添加了I8n国际化,Bean生命周期管理、框架事件体系、资源加载透明化等功能,此外该模块还提供了很多企业级支持,如远程访问、任务调度,邮件服务等。ApplicationContext是该模块的核心接口,它扩展了BeanFactory,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。
(4)spring-expression:spring表达式语言,是统计表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也方便的可以调用对象方法、操作数组、集合等。最出色的要数函数调用和简单字符串的模板函数。
2.AOP和设备支持
(1)spring-aop:面向切面编程,aop就是在某一个类或方法执行前后打个标记,声明在执行到这里之前要先执行什么,执行完这里之后要接着执行什么,插入新的执行方法。在Spring中,它是以JVM的动态代理技术为基础,然后设计一系列AOP横切实现,比如前置通知、返回通知、异常通知等,同时Pointcut接口来匹配切入点,可以使用现有切入点来设计横切面,也可以扩展相关方法根据需求进行切入。
(2)spring-aspects:集成AspectJ, 主要是为Spring AOP提供多种AOP实现方法。
(3)spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器。该模块是基于JAVA SE中的“java.lang.instrument”进行设计的,应该算是AOP的一个支援模块,主要作用是在JVM启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的实现。
3.数据访问及集成
(1)spring-jdbc:jdbc的支持,主要是提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类JdbcTemplate、SimpleJdbcTemplate、NamedParameterJdbcTemplate
(2)spring-tx:事务控制,通过它的AOP配置,可以灵活的配置在任何一层,但是在很多的需求和应用,直接使用JDBC事务控制还是有其优势的。
(3)spring-orm:对象关系映射,集成orm框架,主要集成Hibernate、Java Persistence API(JPA)和Java Data Object(JDO)用于资源管理、数据访问对象(DAO)的实现和事务策略。
(4)spring-oxm:对象xml映射,OXM是Object to XML Mapping的缩写,例如:jaxb, castor xmlbeans,JiBx,XStream等。
(5)spring-jms:java消息服务
(6)spring-messaging:为Spring框架集成一些基础的报文发送应用。
4.Web及远程操作
(1)spring-web:提供最基础的web支持,主要建立在核心容器上,通过Servlet或者Listener来初始化IOC容器,也包括一些与Web相关的支持。
(2)spring-webmvc:实现了Spring MVC的Web应用
(3)spring-websocket:主要是与Web前端的全双工通讯协议。
(4)spring-webflux:是一个新的非阻塞式Reactive Web框架,可以用来建立异步、非阻塞、事件驱动的服务,并且扩展性非常好。
此外,Spring在远程访问及Web Service上提供了对很多著名框架的整合。
该图是Spring 5的包结构,可以从中清楚看出Spring各个模块之间的依赖关系,所以在学习Spring的源码时,可以从Spring-core入手,其次是Spring-beans和spring-aop,随后是spring-context,再其次是spring-tx和spring-orm。
因为spring-core依赖了commons-logging,而其他模块都依赖了spring-core,所以整个spring框架都依赖了commons-logging。
四:Spring4.0新特性
1)全面支持Java 8.0 .框架本身由Spring8.0编译器编译的,编译时使用的是生成Java 6 字节码的编译命令选项,因此可以使用Java 6.0 7.0 和8.0 来运行Spring4.0应用,然后为了使Asm,Cglib等函数能理解Java8.0 生产的新的。class文件,Spring 将这些函数通过jarjar嵌入Spring框架中。这样Spring就可以同时支持Java6.0 ,7.0,8.0的字节码而不会产生运行时错误
支持java 8.0 的 Lambda表达式,时间与日期API,重复注解,空指针终结者 Optional<>
2) 核心容器的增强。支持泛型依赖注入,对Cglib类代理不再要求必须由空参构造。。提供@Conditional 注解来实现Bean的条件过滤,提供@Lazy注解解决了Bean延时依赖注入,支持Bean被注入List或者Array时可以通过@Order注解或基于Ordered接口进行排序
3)支持使用Groovy定义Bean
4)Web增强,Spring MVC 基于Servlet3.0开发,为了方便Rest开发,引入了@RestController控制器注解,这样就不需要在每个@RequestMapping方法上加上@ResponseBody 了。同事添加了AsyncRestTemplate,支持REST客户端的异步无阻塞请求
5)支持WebSocket。。WebSocket提供一个Web应用中高效,双向的通信,需要考虑客户端与服务的之间的高频与低延时消息变换,一般用于在线交易,游戏,协作,数据可视化等
6) 测试增强。
等等。。