-Spring
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
spring框架的一些特征:
-
轻量,从大小与开销两方面而言spring都是轻量的。完整的spring框架可以在一个大小只有1MB多的JAR文件里发布
-
控制反转,spring通过一种称作控制反转IOC的技术促进了低耦合
-
面向切面,spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发
-
容器,spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建
-
框架,spring可以将简单的组件配置、组合成为复杂的应用。在spring中,应用对象被声明式地组合,典型地是在一个xml文件里
-
MVC,Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持
-spring注解
-AOP
AOP(Aspect Oriented Programming,面向切面编程),将程序运行过程分解为一个个的切面,对特定的切面(某个步骤或者阶段)进行提取,达到解耦各种不同逻辑代码。
而OOP(Object Oriented Programming,面向对象编程),通过封装、继承将程序抽象为各个层次的对象,进而组合为模块或者程序,达到了软件工程中的重用性、灵活性、扩展性。程序的运行笼统地可以看为各层次对象之间的相互调用
AOP相关的关键字:
-
Aspect(切面),程序运行过程中的某个的步骤或者阶段
-
Joinpoint(连接点),程序运行过程中可执行特定处理(增强处理)的点, 如异常处理。而在SpringAOP中,方法调用是连接点
-
Advice(通知、处理、增强处理),在符合的连接点进行的特定处理 (增强处理)
-
Pointcut(切入点),可切入进行增强处理的连接点。AOP核心之一就是如何用表达式来定义符合的切入点。在Spring中,默认使用AspectJ的切入点语法
-
Target(目标对象),被进行增强处理的对象
-
AOP代理,是一个重新封装了(增强处理 + 被代理对象的方法 )方法的代理对象
-
织入(Weaving),增强处理切入目标对象以后,并获得代理对象(AOP代理)的这个过程
Spring AOP有两种实现方式:
-
采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行
-
采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码
AOP的主要应用场景:
权限控制、异常处理、缓存、事务管理、日志、数据校验,etc
Spring AOP基于注解的零配置方式:
- 启动@AspectJ注解支持,旭在相应的容器内,加入如下片段
<beans xmlns:aop="http://www.springframework.org/schema/aop" <!-- 必须有相应的XML Schema 配置 -->
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
<!-- 必须相应的容器内,启动@AspectJ支持,如对Springmvc的Contrller织入, 则应在Springmvc.xml中配置 -->
<aop:aspectj-autoproxy />
<!-- 扫描相应的包 -->
- 定义切面bean
@Aspect
@Compement
public class Advice{
/*定义切入点, 业务处理逻辑等等其他内容*/
}
- 定义@Before、@After、@Around等增强处理
/*定义切入点表达式*/
/*配置匹配service包下所有的类、所有的方法*/
@Pointcut("execution(* com.xxx.xxx.service.*.*(..))")
public void pointCutExpress(){
}
- 定义处理方法
@After("pointCutExpress()")
public void closeResource(){
/*After注解,更适合于释放资源*/
}
-IOC
Ioc—Inversion of Control,即控制反转,不是什么技术,而是一种设计思想。
控制反转是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
IoC是如何做的呢?
有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像高圆圆,速度像贝尔,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。
Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
依赖注入
依赖注入的主要目的还是解耦,让spring去管理对象。比如在B中调用A,如果后面A修改频率高,那么B中就不断的维护代码。倘若使用spring托管,也就是Ioc。只需要在spring配置文件中,修改A的相关配置即可,这样,耦合降低了,提高了重用性。而且也解耦合,符合软件工程的思想。
在spring ioc中有三种依赖注入,分别是:
1、接口注入;
2、setter方法注入;
3、构造方法注入;
-Spring Boot 和 Spring Cloud的比较
-
spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务;
-
spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;
-
spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot来实现;
-
Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring boot,属于依赖的关系;
-
相互关系:spring -> spring boot > spring cloud。
例如,某项目A是基于spring cloud,下面的子模块用户、商品、订单、物流、销售分别为独立的微服务。如果微服务内部相互调用,可以通过Eureka、或Zookeeper来实现。
-Eureka
做为服务注册中心,Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。
![](https://img.haomeiwen.com/i11644829/024ec3a9a1719b2e.png)
Eureka的程序构成:
-
是纯正的 servlet 应用,需构建成war包部署
-
使用了 Jersey 框架实现自身的 RESTful HTTP接口
-
peer之间的同步与服务的注册全部通过 HTTP 协议实现
-
定时任务(发送心跳、定时清理过期服务、节点同步等)通过 JDK 自带的 Timer 实现
-
内存缓存使用Google的guava包实现
![](https://img.haomeiwen.com/i11644829/180e7af157edc03d.png)
图中主要的组件:
-
Application Service 相当于本书中的服务提供者,Application Client相当于本书中的服务消费者;
-
Make Remote Call,可以简单理解为调用RESTful API;
us-east-1c、us-east-1d等都是zone,它们都属于us-east-1这个region;
另外,Eureka包含两个组件,Eureka Server 和 Eureka Client,它们的作用如下:
-
Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
-
Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
-
微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒);
-
每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;
-
Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。
-Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
-BeanFactory与ApplicationContext
ApplicationContext是BeanFactory的子接口,也被称为应用上下文。BeanFactory提供了Spring的配置框架和基本功能,ApplicationContext则添加了更多企业级功能(如国际化的支持)。
ApplicationContext的另一重要优势在于当ApplicationContext容器初始化完成后,容器中所有的 singleton Bean 也都被实例化。也就是说当你需要使用singleton Bean 是,在应用中无需等待就可以用,而其他BeanFactory接口的实现类,则会延迟到调用 getBean()方法时构造,ApplicationContext的初始化时间会稍长些,调用getBean()是由于Bean已经构造完毕,速度会更快。因此大部分系统都使用ApplicationContext,而只在资源较少的情况下,才考虑使用BeanFactory。
网友评论