Spring学习(一)--Spring的设计与整体架构

之前只是在学校里大概的学习了一下Spring框架的使用以及一些最基本、浅显的原理,并没有做出深入的学习,等到工作之后想提升自己的时候发现所掌握的Spring框架的简直烂如狗屎,为监督自己的学习进度,立下一个flag,一天一篇Spring框架的学习心得!!

1、Spring的诞生

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

2、Spring的目标

为程序开发者提供一个一站式、轻量级的开发平台,这个平台不仅可以降低代码的开发难度、降低代码之间的耦合度还可以与第三方中间件更好、更便捷的结合。

通过IOC容器来管理POJO对象,以及对象之间的耦合关系。

通过AOP,以动态、非侵入的方式来增强服务的功能。

IOC和AOP是Spring的核心部分,是最为底层的抽象。

3、Spring的整体结构

(1)Spring IOC

Spring的IOC中包含了最基本的IOC容器的beanFactory的接口和实现。

BeanFactory中包含三个子类,分别是ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。而最终实现的类是DefaultListableBeanFactory,实现这个类即可实现所有类。

public interface BeanFactory {
 
    //这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
    String FACTORY_BEAN_PREFIX = "&";
 
    //根据Bean的名字来找到对应的实例。
 
    Object getBean(String name) throws BeansException;
 
    //根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根据名字取得的bean实例的Class类型和需要的不同的话。
    Object getBean(String name, Class requiredType) throws BeansException;
 
    //查看是否在IOC容器有这个名字的bean
    boolean containsBean(String name);
 
    //根据bean名字得到bean实例,并同时判断这个bean是不是单件
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
 
    //对得到bean实例的Class类型
    Class getType(String name) throws NoSuchBeanDefinitionException;
 
    //得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
    String[] getAliases(String name);
}

Spring不仅仅只提供一个IOC容器。

 ① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;

 ② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;

 ③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;

 ④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;

 ⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

(2)Spring AOP

Spring集成了AspectJ作为AOP的特定时现,同时还在JVM动态代理和CGLIB的基础上来实现AOP框架。

JVM动态代理实现分为两种,一种是JDK实现的动态代理和CGLIB方式,不需要强制实现接口。

AOP的最底层实现原理就是代理模式。

例如TransactionProxyFactoryBean声明式事务处理就是一个完整的AOP代理对象,实现AOP拦截器,甚至实现所有Advice的过程。

代理模式:若是我们想使用A类时,我们不直接使用,而是通过B类来调用A类来实现我们最初要使用A类的初衷。

(3)Spring MVC

Spring MVC是为了是后端框架与前端Web模块更好的整合在一起出现的。这个模块以DispatcherServerlet为核心。来实现MVC模式,其中包括与Web容器的集成、Web请求的拦截、分发、处理以及ModuleAndView数据的返回,以及集成各种UI试图展现和数据表现。

(4)Spring JDBC/ORM

在开发过程中,对关系型数据库的操作是很重要的,使用JAVA提供的JDBC过于繁琐,所以Spring提供Spring JDBC来处理对数据库的操作,Spring JDBC就是对JAVA提供的JDBC的进一层封装,使用JdbcTemplate做为模板,其中封装了最近本的数据库操作,例如:增加、修改、删除、查询等,并且还提供了RDBMS的操作对象,通过这些对象可以将数据映射到集合中,类似于一个小型的ORM操作。

Spring ROM:Spring框架封装了许多ORM工具,例如:Hibernate、Mybatis等,还为其提供了许多模板,例如HibernateTemplate等,便于与ORM框架联合使用。

(5)Spring 事务处理

Spring事务处理是通过SpringAOP实现的增强自身服务的模块,在这个模块中,Spring把事务处理的主要过程提出来,并且通过AOP的切面增强声明式事务处理功能。

(6)Spring 远端调用

通过Spring的端对端调用,通过Spring的封装,隐藏了各种通信以及调用细节。

(7)Spring 应用

  1. Spring IO Platform : Spring IO是可集成的、构建现代化应用的版本平台。Spring IO是模块化的、企业级的分布式系统,包括一系列依赖,是的开发者仅能对自己所需的部分进行完全的部署控制。
  2. Spring Boot:Spring应用快速开发工具,用来简化Spring应用开发过程。
  3. Spring XD:Spring XD(eXtreme Date,极限数据)是Pivotal的大数据产品。它结合了Spring Boot和Grails,组成Spring IO平台的执行部分。
  4. Spring Data:Spring Data是为了简化构建基于Spring框架应用的数据访问实现,包括非关系数据库、Map-Reduce框架、云数据服务等;另外,也包含对关系数据库的访问支持。
  5. Spring Integration:Spring Integration为企业数据集成提供了各种适配器,可以通过这些适配器来转换各种消息格式,并帮助Spring应用完成与企业应用系统的集成。
  6. Spring Batch:Spring Batch是一个轻量级的完整批处理框架,皆在帮助应用开发者构建一个健壮、高效的企业级批处理应用(这些应用的特点是不需要与用户交互,重复的操作量大,对于大容量的批量数据处理而言,这些操作往往要求较高的可靠性)
  7. Spring Security:Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文配置的bean,充分利用Ioc和AOP功能,为应用系统提供声明式的安全访问控制功能。
  8. Spring Hateoas:Spring Hateoas是一个用户支持实现超文本驱动的REST Web服务的开发库,是Hateoas的实现。Hateoas(Hypermedia as the engine of application state)是REST架构风格中最复杂的约束,也是构建成熟REST服务的核心。它的重要性在于打破了客户端和服务器之间严格的契约,是的客户端可以更加智能和自适应。
  9. Spring Social:Spring Social是Spring框架的扩展,用来方便开发Web社交应用程序,可通过该项目来创建与各种社交网站的交互,如Facebook,LinkedIn、Twitter等。
  10. Spring AMQP:Spring AMQP是基于Spring框架的AMQP消息解决方案,提供模版化的发送和接收消息的抽象层,提供基于消息驱动的POJO。这个项目支持Java和.NET连个版本。Spring Source旗下的Rabbit MQ就是一个开源的基于AMQP的消息服务器。
  11. Spring for Android:Spring for Android为Android终端开发应用提供Spring的支持,它提供了一个在Android应用环境中工作、基于Java的REST客户端。
  12. Spring Mobile:Spring Mobile是基于Spring MVC构建的,为移动端的服务器应用开发提供支持。
  13. Spring Web Flow:Spring Web Flow(SWF)一个建立在Spring MVC基础上的Web页面流引擎。
  14. Spring Web Service:Spring Web Service是基于Spring框架的Web服务框架,主要侧重于基于文档驱动的Web服务,提供SOAP服务开发,允许通过多种方式创建Web服务。
  15. Spring LDAP:Spring LDAP是一个用户操作LDAP的Java框架,类似Spring JDBC提供了JdbcTemplate方式来操作数据库。这个框架提供了一个LdapTemplate操作模版,可帮助开发人员简化looking up、closing contexts、encoding/decoding、filters等操作。
  16. Spring Session: Spring Session致力于提供一个公共基础设施会话,支持从任意环境中访问一个会话,在Web环境下支持独立于容器的集群会话,支持可插拔策略来确定Session ID,WebSocket活跃的时候可以简单地保持HttpSession。
  17. Spring Shell: Spring Shell提供交互式的Shell,用户可以简单的基于Spring的编程模型来开发命令。

---------------------
作者:DoReMiFaSolLaTi
来源:CSDN
原文:https://blog.csdn.net/xxieyyuhhui/article/details/80654296
版权声明:本文为博主原创文章,转载请附上博文链接!

4、Spring的适用场景

适用于框架集合开发,例如:使用SSH框架进行程序开发,S-Struts框架:Web UI层,S-Spring框架:中间件平台,H-Hibernate框架:ORM工具。通过Spring框架改进体系结构,可以帮助我们选择不同的技术实现,例如将Struts替换成Spring MVC,将Hibernate替换成Mybatis等,虽然我们不会这么无聊的去做,但是选择Spring作为应用平台,它给我们提供了这样的可能性和选择,降低了平台锁定的风险。

posted @ 2019-05-09 15:51  CarBlack  阅读(1288)  评论(0编辑  收藏  举报