《Spring技术内幕:深入解析Spring架构与设计原理》笔记之一(Spring基本概述)

    一直不懂Spring的两大块内容:IOC和AOP。

    现在,找来这个《Spring技术内幕:深入解析Spring架构与设计原理》pdf好好拜读学习一下。    

    Spring的主要projects:

    Spring IO platform

    spring boot

    spring framework:spring项目的核心,包括依赖注入、事务、验证、数据绑定和AOP

    spring cloud data flow

    spring cloud

    spring data:该项目为Spring应用提供使用非关系型数据的能力,比如,当基础数据并非存储在关系数据库中时,又如Map-Reduce中的分布式存储、云计算存储环境中等。Spring应用可以考虑使用Spring Data来操作这种类型的数据。

    spring integration:体现了“企业集成模式”的具体实现,并为企业的数据集成提供解决方案。Spring Integration为企业数据集成提供了各种适配器,通过这些适配器来转换各种消息格式,并帮助Spring应用完成与企业应用系统的集成。

    spring batch:提供构建批处理应用和自动化操作的框架,这些应用的特点是不需要与用户交互,重复的操作量大。对于大容量的批量数据处理而言,这些操作往往要求较高的可靠性。

    spring security:广泛使用的基于Spring的认证和安全工具,为Spring应用提供一个安全服务,比如用户认证、授权等。

    spring Hateoas

    spring  rest docs

    spring social:是spring框架的扩展,可以帮助Spring应用更方便地使用SNS(Social Network Service),例如FaceBook和Twitter这些服务的使用等。

    spring amqp:是为Spring应用更好地使用基于AMQP(高级消息队列协议)的消息服务开发的,使在Spring应用中使用AMQP消息服务器变得更为简单。这个项目支持Java和.NET两个版本。SpringSource旗下的Rabbit MQ就是一个开源的基于AMQP的消息服务器,Rabbit MQ是用Erlang语言开发出来的。

    spring mobile:Spring mobile和Spring Android不同,它能使工作在Spring传统的服务端完成。它是基于Spring MVC构建的,为移动终端的服务器应用开发提供支持,比如,使用Spring Mobile可以在服务器端自动识别连接到服务器的移动终端的相关设备信息,从而为特定的移动终端实现应用定制。

    spring for android:为android终端开发应用提供Spring的支持,它提供一个在Android应用环境中工作,基于Java的REST客户端。

    spring web flow:建立在spring MVC基础上的web工作流引擎。Spring Web Flow定义了一种特定的语言来描述工作流,同时高级的工作流控制器引擎可以管理会话状态,支持Ajax来构建丰富的客户端体验,并且提供对JSF的支持。

    spring web service

    spring ldap

    spring session

    spring shell

    spring flo

    spring kafka

    spring statemachine

Spring的主要架构:

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之一(Spring基本概述)

在这个架构图中,我们可以看到以下的Spring基本组成模块

  • Spring IOC:

       包含了最基本的IOC容器BeanFactory的接口和实现,也就是说,在这个Spring的核心包内,不仅定义了IOC容器的最基本的接口(BeanFactory),也提供了一系列这个接口的实现,如XMLBeanFactory就是一个最基本的BeanFactory(IOC容器),从名字上可以看到,它能够支持通过XML文件配置的Bean定义信息。除此之外,Spring IOC容器还提供了一个容器系列,如SimpleJndiBeanFactoy、StaticListableBeanFactory等。在BeanFactory接口实现中,除了前面介绍的像BeanFactory那样最为基本的容器形态之外,Spring还设计了IOC容器的高级形态ApplicationContext应用上下文提供用户使用,这些ApplicationContext应用上下文,如FileSystemXmlApplicationContext、ClassPathXmlApplicationContext,对应用来说,是IOC容器中面向框架的使用方式,同样,为了便于应用开发,像国际化的消息源和应用支持事件这些特性,也都在这个模块中配合IOC容器来实现,这些功能围绕IOC基本容器和应用上下文的实现,构成了整个Spring IOC模块设计的主要内容。

  • Spring AOP:

        这也是Spring的核心模块,围绕着AOP的增强功能,Spring集成了AspectJ作为AOP的一个特定实现,同时还在JVM动态代理、CGLIB的基础上,实现了一个AOP框架,作为Spring集成其他模块的工具,比如TransactionProxyFactoryBean声明式事务处理,就是通过AOP集成到Spring中的。在这个模块中,Spring AOP实现了一个完整的建立AOP集成到Spring中的。在这个模块中,Spring AOP实现一个完整的建立AOP代理对象,实现AOP拦截器,直至实现各种Advice通知的过程。在这个模块的分析中可以看到,AOP模块的完整实现是我们熟悉AOP实现技术的一个不可多得的样本。

  • Spring MVC:

        对于大多数企业应用而言,Web应用已经是一种普遍的软件发布方式,而在web应用的设计中,MVC模式已被广发使用了。在Java社区中也有很多类似的MVC框架可以选择,而其这些框架往往和web ui设计整合在一起,对于定位于提供整体平台解决方案Spring,这样的整合也是不可缺少的。Spring MVC就是这样一个模块,这个模块以DiapatcherServlet为核心,实现了MVC模式,包括怎样与Web容器环境的集成,Web请求的拦截,分发,处理和ModelAndView数据的返回,以及如何集成各种UI视图展现和数据表现,如PDF、Excel等,通过这个模块,可以完成Web的前端设计。

  • Spring JDBC/Spring ORM:

        在企业应用中,对以关系数据库为基础的数据的处理是企业应用的一个重要方面,而对于关系数据库的处理,Java提供了JDBC来进行操作,但在实际应用中,单纯使用JDBC的方式还是有些繁琐,所以在JDBC规范的基础上,Spring对JDBC做了一层封装,使通过JDBC完成的对数据库的操作更加简洁。Spring JDBC包括提供了JdbcTemplate作为模板类,封装了基本的数据库操作方法,如数据的查询、更新等;另外,SpringJDBC还提供了RDBMS的操作对象,这些操作对象可以使应用以更面向对象的方法来使用JDBC,比如可以使用MappingSqlQuery将数据库数据记录直接映射到对象集合,类似一个极为简单的ORM工具。除了通过Spring JDBC对数据库进行操作外,Spring还提供了许多对ORM工具的封装,这些封装包括了常用的ORM工具,如Hibernate、iBatis等,这一层封装的作用是让应用更方便地使用这些ORM工具,而不是代替这些ORM工具,比如可以把这些工具的使用和Spring提供的声明式事务处理结合起来。同时,Spring还提供了许多模板对象,如HibernateTemplate这一的工具来实现Hibernate的驱动,这些模板对象往往包装使用Hibernate的一些通用过程,比如Session的获取和关闭、事务处理的关联等,从而把一些通用的特性实现抽象到Spring中来,更充分地实现了Spring的平台作用。

  • Spring事务处理:

        Spring事务处理是一个通过Spring AOP实现自身功能增强的典型模块。在这个模块中,Spring在把企业应用开发中事务处理的主要过程抽象出来,并且简洁地通过AOP的切面增强实现了声明式事务处理的功能。这个声明式事务处理的实现,使应用只需要在IOC容器中对事务属性进行配置即可完成,同时,这些事务处理的基本过程和具体的事务处理器实现是无关的,也就是说,应用可以选择不同的具体的事务处理机制,如JTA、JDBC、Hibernate等。因为使用了声明式事务处理,这些具体的事务处理机制被纳入Spring事务处理的统一框架中完成,并完成与具体业务代码的解耦。在这个模块中,可以看到一个通用的实现声明式事务处理的基本过程,比如怎样配置事务处理的拦截器,怎样读入事务配置属性,并结合这些事物配置属性对事务处理器(如DataSourceTransactionManager、HibernateTransactionManager、JtaTransactionManager等)是怎样封装不同事务处理机制(JDBC、Hibernate、JTA等)的。

  • Spring远端调用:

        Spring为应用带来的一个好处就是能够将应用解耦。应用解耦,一方面可以降低设计的复杂性。另一方面,可以在解耦以后将应用模块分布式地部署,从而提高系统整体的性能。在后一种应用场景下,会用到Spring的远端调用,这种远端调用是通过Spring的封装应用到Spring应用之间端到端的调用。在这个过程中,通过spring的封装,为应用屏蔽了各种通信和调用细节的实现,同时,通过这一层的封装,使应用可以通过选择各种不同的远端调用来实现,比如,可以使用HTTP调用器(以HTTP协议为基础的),可以使用第三方的二进制通信实现Hessian/Burlap,甚至还封装了传统Java技术中的RMI调用。

  • Spring应用:

        从严格意义上来说,这个模块不属于Spring的范围。这部分的应用支持,往往来自一些使用得非常广泛的Spring子项目,或者该子项目本身就可以看成是一个独立的Spring应用,比如Spring的处理安全问题的Spring ACEGI后来转换为Spring子项目的Spring Security OAuth等。这个Spring应用支持的部分还有一个重要的组成,那就包括了其他一些模块,这些模块提供了许多Spring应用与其他技术上实现的相关接口,比如与各种J2EE实现规范的接口,对JMS、JNID、JMX、JavaMail等的支持,Spring应用和Flex前端的接口,Spring应用移植到OSGI平台上运行的接口。通过这个模块的支持,使Spring应用可以便利和简洁地容纳第三方的技术实现,不但丰富了Spring应用的功能,而且丰富了整个Spring生态圈,使Spring应用得越来越广泛。