• Spring 常见的注入方式
  • Spring 生命周期
  • Spring AOP 的两种方式和区别
  • Spring 循环依赖问题,怎么解决
  • Spring MVC 执行流程
  • 反射的应用场景
  • 序列化、反序列化。对象流、版本的作用
  • 线程池的执行流程
  • Redis 常见数据类型和应用场景
  • Redis 持久化的方式和区别
  • SpringCloud 常用组件
  • SpringCloud 如何实现高可用
  • docker
  • k8s

Spring 常见的注入方式

Spring 通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入、setter注入、基于注解的注入。image-20200416155620897.png

Spring 生命周期

image.png
image.png

Spring AOP 的实现方式和区别

基于注解的AOP编程的开发步骤

  • 原始对象
  • 额外功能
  • 切入点
  • 组装切面

AOP底层实现 2种代理创建方式

  • JDK 通过实现接口新的实现类方式,创建代理对象
  • Cglib 通过继承父类新的子类,创建代理对象

默认情况 AOP编程,底层应用 JDK 动态代理创建方式。
如果切换Cglib
①基于注解AOP开发

  1. <aop:aspectj-autoproxy proxy-target-class="true" />

②传统的AOP开发

  1. <aop:config proxy-target-class="true">

常见问题 - 图4

代理对象的生成,是通过 JDK 的 API(反射机制),动态的在内存中构建代理对象

在 Java 中要想实现动态代理机制,需要 java.lang.reflect.InvocationHandler 接口和 java.lang.reflect.Proxy 类的支持。

cglib代理

静态代理和 JDK 代理模式都要求目标对象实现一个接口,但有时候目标对象只是一个单独的对象,并没有实现任何接口,这个时候就可以使用目标对象子类来实现代理,这就是 cglib 代理。

cglib(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。cglib 通过继承方式实现代理。它广泛的被许多AOP的框架使用,比如我们的 Spring AOP。
cglib 包的底层是通过使用字节码处理框架 ASM 来转换字节码并生成新的类。
cglib 代理也被叫做子类代理,它是在内存中构建一个子类对象从而实现目标对象功能扩展。

Spring 循环依赖问题,怎么解决

三级缓存

  • spring如何解决单例循环依赖问题?

    spring循环引用场景 循环依赖的产生可能有很多种情况,例如:

    • A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象
    • A的构造方法中依赖了B的实例对象,同时B的某个field或者setter需要A的实例对象,以及反之
    • A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象,以及反之

Spring对于循环依赖的解决不是无条件的,首先前提条件是针对scope单例并且允许解决循环依赖的对象。以上三种情况: 第一种Spring无法解决, 第二种只能解决一部分情况, 第三种可以解决

因此得出结果:spring解决的循环依赖只是部分, 而无法解决的情况是在使用构造函数互相引用的场景. spring bean声明中应避免第一种情况 和 第一种情况的变种情况.

Spring MVC 执行流程

Spring MVC 执行流程
image.png

  1. 一个请求匹配前端控制器 DispatcherServlet 的请求映射路径(在 web.xml中指定), WEB 容器将该请求转交给 DispatcherServlet 处理

  2. DispatcherServlet 接收到请求后, 将根据 请求信息 交给 处理器映射器 (HandlerMapping)

  3. HandlerMapping 根据用户的url请求 查找匹配该url的 Handler,并返回一个执行链

  4. DispatcherServlet 再请求 处理器适配器(HandlerAdapter) 调用相应的 Handler 进行处理并返回 ModelAndView 给 DispatcherServlet

  5. DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View

  6. DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)

  7. DispatcherServlet 将页面响应给用户

组件说明

DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,
由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,
例如:配置文件方式,实现接口方式,注解方式等。

Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

ViewResolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,
再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

反射的应用场景

Redis 常见数据类型和应用场景

Redis 持久化的方式和区别

SpringCloud 常用组件和作用

  • 服务发现——Eureka
  • 客户端负载均衡——Ribbon
  • 断路器——Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config

    SpringCloud 如何实现高可用

  • SpringCloud高可用和高并发