Spring
一个开源的、用于构建企业级Java应用程序的框架。
特性
- 依赖注入(DI):Spring容器统一管理Bean对象的生命周期。
- 切面编程(AOP):在不改变原有代码的情况下,可通过定义注解的方式,在指定的代码块运行前、后均可添加逻辑。
- 控制反转(IOC):spring反向控制应用程序所需使用的外部资源。
- 声明式事务管理:通过注解可定义事务,该事务基于AOP实现。
Spring的配置形式
- 基于xml文件的配置形式。(每集成一个中间件都需要添加一个xml文件,导致集成过于繁琐)
- 基于注解的方式。
Spring Bean的生命周期
- 首先拿到类对象。
- 默认通过无参构造函数今昔实例化。(该实例化运用了反射机制)
- 实例化后就形成了普通对象。
- 扫描类中是否包含注入类的注解,存在该注解则进行依赖注入。
- 初始化,可以通过注解或者接口重写的方式改写。
- 形成bean对象(其与普通的对象区别就在于依赖注入。
- 放入bean容器中(容器数据格式为 map<String , Object>)
拓展点:实例化默认使用无参构造函数,但如果没有无参构造函数但存在一个有参构造函数则使用该有参构造函数进行实例化。但如果没有无参构造函数存在两个有参构造函数此时启动项目则会报错。但可以用@Autowired来让标明该使用哪个有参构造函数。
Spring的注解
包扫描与组件标注注解
- @Component:泛指各种组件
- @Controller:控制层
- @Service:业务层
- @Repository:数据访问层
导入注解
- @Bean:导入第三方包的注解。
- @Import:导入到容器中的组件。
- @Import Selector:返回需要导入的组件的全类名数组。
- @Import Bean Definition Registrar:手动注册bean到容器中。
注入bean的注解
- @Autowired & @Inject 按照类型匹配
- @Resource 按照名称匹配
初始化和销毁方法
- @PostConstruct:初始化方法
- @preDestory:销毁方法
配置类相关注解
- @Configuration:声明当前类为配置类。
- @Bean:注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式。
- @ComponentScan:对Component进行扫描。
切面相关注解(AOP)
- @Aspect:声明一个切面。
- @After:在方法执行之后再执行。
- @Before:在方法执行之前就执行。
- @Around:在方法执行前后均执行。
- @PointCut:声明切点。
- @EnableAspectjAutoProxy:开启Spring对AOP的扫描与支持。
异步相关
- @EnableAsync:开启对异步任务的支持。
- @Async:声明一个异步任务。
定时任务相关
- @EnableScheduling:开启定时任务的支持。
- @Scheduled:声明一个定时任务。
SpingAOP
定义:
AOP创建于bean初始化之后的节点。AOP的核心机制为动态代理。
事务:
基于Aop实现的动态代理。(该事务就是简单的本地事务)
事务会失效的几个场景:
- 是否是一个bean(添加@Service)
- 内嵌调用,同一个类中的方法自行调用,没有经过AOP所以失效。
- 方法为私有方法,外部无法调用。
- 异常被捕获但未抛出,导致程序认为这是可预见的异常,不影响程序运行结果。
- 抛出异常不是RuntimeException,因为默认回滚的是运行异常。可以在注解中自己定义需要回滚的异常类型。
- 配置文件中未开启事务。
- 多线程调用。
- 数据库引擎不支持事务。
- 事务的传播行为设置不当。
SpringBoot详解
作用
主要简化了spring项目的搭建难度,不需要过多的xml文件即可搭建服务。springboot适用于单体架构的服务。该配置文件就是项目中的本地配置文件)。
机制
通过自动配置、起步依赖和内嵌服务器等特性,简化了spring应用的开发和部署。其灵活的配置机制(支持多环境、命令行、环境变量)使得应用能快速适应不同场景的需求。
Sping MVC详解
定义
spring框架中基于mvc模式的web架构。通过分层架构将请求处理、业务逻辑和视图渲染解耦。
MVC模式
- model(模型):封装业务数据和业务逻辑。
- view(试图):负责数据展示。
- controller(控制器):接收用户请求,协调model和view。
请求流转
- 用户发起请求——前端控制器接受请求。
- 请求映射——HandlerMapping查找匹配的Controller方法。
- 业务请求——controller调用service层处理并返回视图。
- 视图解析——viewResolver将逻辑视图名解析为具体视图。
- 渲染视图——view 渲染数据并返回给客户端。
注解
@RequestMapping @GetMapping @PostMapping 用于定义rul映射,通过该映射才能找到指定的Controller接口。
Spring Cloud详解
定义
基于SpringBoot的微服务架构开发工具集。用于快速构建分布式系统的常见模式。提供标准化一站式的微服务解决方案。总的来说就是SpringBoot适用于单一架构的服务创建,而SpringCloud则用来整合SpringBoot创建的服务,形成一个微服务架构。
核心架构
- 服务注册与发现:动态管理服务实例的ip地址、别名以及健康情况。
- 负载均衡:根据设置将请求分发到多个实例中。
- 服务调用:简化服务间通信,摒弃了传统的http请求。
- 熔断与容错:建立熔断机制防止服务雪崩,提升系统弹性。
- API网关:统一入口、路由、过滤和安全控制。
- 分布式管理:集中管理多环境配置。
- 消息驱动:异步通信和解耦服务。
- 分布式链路追踪:监控服务调用链,定义性能瓶颈。
核心组件
- 服务注册与发现(Eurka、Nacos):类似于一个表单,服务启动成功后注册到注册中心上,注册中心将记录服务的别名、ip地址、实例以及健康情况。
- 客户端负载均衡(Ribbon、LoDBalancer):在服务消费端实现负载均衡(轮询、随机以及根据权重比)结合注册中心发现服务实例列表,将请求分发到不同的实例上。
- 声明式服务调用(OpenFeign):通过服务别名从注册中心上找到请求实例,再根据注解中的请求路径来找到具体的controller接口,达到远程调用的目的。摒弃了传统的http请求,当两个服务都注册到同一个注册中心时就可以通过该方式来简化请求调用。
- 熔断与容错(Hystrix、Resilience4J):当服务调用失败率超过一个阈值时,自动熔断请求。提供降级处理逻辑(FallBack),保证系统部分可用,避免了服务的雪崩。
- 网关(GatWay、zuul):统一入口——通过路由、断言请求到对应的服务中。过滤请求——身份认证、日志记录、限流等作用。
- 分布式配置中心(Config Server):集中管理所有微服务的配置文件——xxx.yml 支持多环境配置动态切换。
- 消息驱动(stream):通过消息中间件(MQ、kafka)实现服务间异步通信,解耦服务,提升系统吞吐量和可靠性。
- 分布式链路追踪(sleuth、zipkin)为每个请求生成唯一跟踪Id,记录服务调用链。通过Zipkin可视化分析请求路径和耗时。可以排查整个请求链路中出现的问题。
拓展:如何让服务快速熔断?
- 配置文件中降低服务熔断阈值。
- 方法上添加注解@HystrixCommand,并主动抛出异常,当三次请其中错误率达到50%则立即熔断。
总结
Spring
spring主要的作用是管理bean的生命周期,通过反射机制实例化出对象后再经历依赖注入就形成了bean,再将bean放入一个容器中,达成一个简单的单例模式,让bean在程序中可以随时使用;
其中bean创建前与创建后的两个节点衍生出了AOP事务,基于动态代理实现。
其中Spring包含了很多注解,它们作用于Spring启动后的DI,由DI完成依赖注入,再根据注解完成IOC控制反转,这就形成了bean对象。
Spring Boot
简化了spring项目的搭建难度,将多个中间件可以整合在一个配置文件中完成。主要作用于单体服务架构。
Spring Cloud
拥有很多组件,组件的目的就是用于构建微服务架构。微服务架构是将多个单体架构整合起来,统一管理形成的。也就是说基于Spring Boot创建的单体架构,再使用Spring Cloud的一些组件一起形成了微服务架构。其中注册中心就是将各个单体架构整合在一起。实现了微服务的服务治理、配置管理以及容错处理等核心问题。
Spring MVC
基于MVC模式的web架构。通过分层架构来处理请求。通过请求映射到Controller控制层,然后控制层调用指定的模型层中的实现方法,模型层返回视图由view层进行渲染。
微服务流转情况
服务启动:加载本地配置(spring Boot)——连接配置中心——获取动态配置——连接注册中心——注册实例——启动完成
外部接口调用:请求进入——网关——注册中心——负载均衡——服务实例——指定的接口
内部调用:服务消费者——注册中心——负载均衡——实例