对于Spring,相信大家都非常熟悉,从出现开始,一直是企业级开发的主流。但是随着软件的发展和应用开发的不断演化,它的一些缺点也逐渐暴露了出来。下面看一下Spring的发展历程并且认识一下Spring Boot。
由来
在Spring1.x的时候,所有的配置都通过XML实现,随着项目的扩大,需要频繁地在Java和XML之间切换。
在Spring 2.x的时候,已经开始逐步替换掉XML配置。在Spring 3.x的时候,已经开始提供Java的配置方式,在Spring 4.x的时候,已经全部推荐使用Java配置的方式。随着动态语言的流行,Java的开发显得格外烦琐,主要体现在配置的复杂、开发效率低下,以及与第三方集成的繁杂等方面,这个时候Spring Boot应运而生。
Spring Boot是由Pivotal 团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建和开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、 产品级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置,减少与第三方库集成的复杂度。
Spring Boot 的核心思想就是约定大于配置,多数Spring Boot 应用只需要很少的Spring配置。采用Spring Boot可以大大简化开发模式,所有想集成的常用框架,它都有对应的组件支持。
特性
方便地创建独立的Spring应用,为基于Spring 的开发提供更快的入门体验。内置Tomcat,无须生成WAR文件。简化Maven配置。自动配置Spring,更快、更方便地与第三方应用整合,比如消息队列、缓存等在企业级开发中常用的组件。提供大型项目中的非功能特性,如指标、安全、健康检查及外部配置。开箱即用,无须代码生成,也无须XML配置,同时能够通过修改默认值来满足待定的需求。四大神器
自动配置SpringBoot的自动配置功能可基于类路径检测自动为运行中的应用配置依赖关系,不需要提供额外的XML配置。
StartersSpring Boot可提供一系列称 为POM Starters的精细依赖关系。Spring Boot熟知如何配置这些依赖关系,同时让组织能够扩展SpringBoot来配置自定义的依赖关系。
ActuatorActuator可提供运行状况检查和指标等生产就绪型功能。这些功能通过Spring Boot应用内的REST终端提供,只需要简单的配置就可以实现强大的监控和检查。
开发工具这些工具旨在缩短开发和测试周期,其中包括一个可在资源变更时触发浏览器刷新的嵌入式LiveReload 服务器。这些工具还提供了应用自动重启功能,只要类路径上的文件发生更改,该功能即可启动。
重启技术使用两种类加载器,未更改的分类(例如,来自第三方JAR的类)被加载到基础类加载器,而开发中的分类则被加载到重启类加载器。当应用重启时,重启类加载器会被丢弃,同时创建-一个新的类加载器。这种方法意味着应用重启的速度通常要比“冷启动”的速度快得多,因为基础类加载器已准备就绪且已填充完毕,从而快速实现应用的热部署,对于简单的修改这种场景能够非常有效地提高效率。
快速集成第三方的Starter
介绍
Spring Boot的Starter主要用来简化依赖,对于企业级开发中与第三方的集成,可以通过一段简单的配置来完成,这样开发人员无须再对包依赖的问题头疼。SpringBoot为我们提供了简化企业级开发的绝大多数场景的Starterpom,只需要指定需要配置的Starter,SpringBoot会自动为我们提供配置好的Bean。
原理
Spring Boot常用的Starter (启动器)如下。
Spring-boot- strterlogging:使用Spring Boot默认的日志框架Logback。Spring-boot-starter-log4j:添加Log4j的支持。Spring-boot-starter-web:支持Web应用开发,包含Tomcat和Spring mvc。Spring-boot-starter-tomcat:使用Spring Boot默认的Tomcat作为应用服务器。Spring-boot- sarerjetty:使用Jetty而不是默认的Tomcat作为应用服务器。Spring-boot- starter-test:包含常用的测试所需的依赖,如JUnit、Hamcrest、 Mockito 和Spring-test等。Spring-boot-starter-AOP:包含Spring-AOP和AspectJ来支持面向切面编程(AOP)。Spring-boot-starter-security:包含Spring-security。Spring-boot-starter-jdbc:支持使用JDBC访问数据库。Spring-boot-starter-redis:支持使用Redis.Spring-boot-starter-data-mongodb:包含Spring-data-mongodb 来支持MongoDB。Spring-boot-starter-data-jpa:包含Spring-data-jpa、 Spring-orm 和Hibernate来支持JPA。Spring- boot starter amqp:通过Spring-rabbit支持AMQP。Spring-boot-starter-actuator:添加适用于生产环境的功能,如性能指标和监测等功能。降低开发复杂度之面向切面
在软件业,AOP为Aspect Oriented Programming的缩写,意为面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高了程序的可重用性,同时提高了开发的效率
AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,它们经常发生在核心关注点的多处,而各处都基本相似,比如权限认证、日志、事务处理。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
AOP中的一些名词如下。
切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式或者基于@ Aspect注解的方式来实现。连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在SpringAOP中,一个连接点总是表示-一个方法的执行。通知( Advice):在切面的某个特定的连接点上执行的动作,其中包括“around”、“before和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都以拦截器作为通知模型,并维护一个以连接点为中心的拦截器链。切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心: Spring 默认使用AspectJ 切入点语法进行匹配。引入(Introduction):用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,可以使用引入来使一个Bean实现IsModified接口,以便简化缓存机制。目标对象(TargetObject):被一个或者多个切面所通知的对象,也被称为被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)对象。AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(例如,通知方法执行,等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。织入(Weaving):把切面连接到其他应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如,使用AspectJ编译器)、类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。AOP小结
AOP为我们提供了一种以切面方式编程的方法,在业务处理过程中,日志的记录、数据源的切换、事务的处理都可以用AOP的方式解决,而跟Spring Boot的整合,让我们开发AOP又进一步地简化,使面向对象能够更加方便地发挥所长。
并不复杂的持久化
数据的访问或者跟数据库的交互在任何应用中都是非常重要的一个环节。我们的应用中有可能使用关系型数据库,也有可能使用非关系型数据库。非关系型数据库也就是我们经常说的NoSQL (Not Only SQL)。简言之,就是说在一个应用中,可以根据业务自身的特点和需要,选择适合的数据库,除了常用的关系型数据库,使用非关系型数据库也是不错的选择。
简介
持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储到数据库中,或者存储到磁盘文件中。持久化是将程序数据在持久状态和瞬时状态间转换的机制。JDBC和文件I/O操作就是--种典型的持久化机制。
Spring Boot使持久化集成变成了- -项非常简单的任务,因为它具有自动配置Spring Data以访问数据库的能力。只需在工程中将Spring boot-starter- data-jpa包含进来,Boot 的自动配置引擎就能探测到工程需要数据访问功能,并且会在Spring应用上下文中创建必要的Bean。
JPA是Java Persistence API的简称,中文名是Java持久层API,是JDK 5.0注解或XML描述对象一关系表的映射关系,并将运行期的实体对象持久化到数据库中。严格来说,它是一套持久层的规范,用作为持久化的统一标准接口。
Spring Data JPA是Spring为JPA提供的一套实现,可以极大地简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除CRUD外,还包括如分页、排序等一些常用的功能。
Mybatis和Hibernate都对JPA有相应的实现,使用此规范的实现,可以极大地简化开发,这也是微服务所提倡的。
事务处理
事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。
Spring Framework对事务管理提供了一致的抽象, 包括:
为不同的事务API 提供一致的编程模型,比如JTA(Java Transaction API)、 JDBC、Hibernate、JPA(Java Persistence API和JDO(Java Data Objects)。支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用。提供比其他事务API (如JTA)更简单的编程式事务管理API。与Spring数据访问抽象的完美集成。而我们所说的事务的关键属性,也就是我们经常说的ACID包括:
原子性(atomicity) 一事务 是一个原子操作,由一系列动作组成。 事务的原子性确保动作要么全部完成,要么完全不起作用。一致性(consistency) 一旦所有事务动作完成, 事务就被提交。数据和资源就处于一种满足业务规则的一致性状态中。隔离性(isolation) 一可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。持久性(durability)一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。通常情况下,事务的结果被写到持久化存储器中。
如果没有事务存在,则按照REQUIRED属性执行,该属性只对DataSource TransationManager事务管理器有效。
并发引起的事务问题
同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题。
并发事务所导致的问题可以分为以下三类。
脏读:脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。不可重复读:不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。通常是因为另一个并发事务在两次查询期间更新了数据。幻读:幻读与不可重复读类似。它发生在一个事务(T1) 读取了几行数据,接着另一个并发事务(T2) 插入了一些数据时。在随后的查询中,第一个事务(T1) 就会发现多了一些原本不存在的记录。以上就是小编简单整理的微服务架构中的Spring Boot解析,只是小编个人的理解,有哪里不合适的地方,还请大家多多指出,咱们共同进步!!!
喜欢文章请多多点赞评论分享,予人玫瑰,手留余香。关注小编,后续小编会再带来更丰富的微服务学习内容,咱们每天进步一点点哦~~~