Spring的IOC和DI

  1. IOC :控制反转,将对象的创建销毁等交由外部容器
  2. DI :依赖注入,将类作为属性注入到另一个类中(本质就是聚合)

    Spring的AOP

  3. AOP :面向切面编程(基于动态代理实现),对切点匹配到的方法在不改变源码的基础下进行增强处理

  4. 切入点表达式 : execution(* 包名.类名.方法名(..)) 用来匹配对应的方法
  5. 通知 :增强处理的内容

    1. 前置通知
    2. 后置通知
    3. 失败通知
    4. 成功通知
    5. 环绕通知

      Spring循环依赖

      Spring Bean的生命周期

      创建
  6. 实例化Bean对象

  7. 设置Bean的属性
  8. 注入Aware的依赖
  9. 执行通用方法的前置处理 :BeanPostProcessor.postProcessorBeforeInitialization()
  10. 执行InitalizingBean.afterPropertiesSet()方法
  11. 执行Bean自定义的初始化方法init,或者 @PostConstruct 标注的方法
  12. 执行方法BeanPostProcessor.postProcessorAfterInitialization()
  13. 创建对象完毕

销毁

  1. 执行 DisposableBean.destory() 方法
  2. 执行自定义的destory方法或者 @PreDestory 标注的方法
  3. 销毁对象完毕

框架 - 图1

Spring 涉及的设计模式

  1. 工厂模式 :BeanFactory
  2. 单例模式 :Spring Bean 默认单例
  3. 适配器模式 :Spring AOP 使用Advice(通知)来增强被代理类的方法
  4. 代理模式 :Spring AOP基于JDK动态代理实现
  5. 包装器模式 :
  6. 模板方法模式 :
  7. 策略模式 :
  8. 观察者模式 :

    spring常用注解

    1. //声明Spring Bean(控制反转)
    2. @Component
    3. @Service
    4. @Repository
    5. @Controller
    6. @Resource
    7. //依赖注入
    8. @Autowired
    9. //aop 相关
    10. @Aspect //切面
    11. @PointCut //切点
    12. @After //前置通知
    13. @Before //后置通知
    14. @Around //环绕通知

    @EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持)

    SpringMvc的运行流程

    框架 - 图2

  9. 用户发送请求至前端控制器DispatcherServlet

  10. DispatcherServlet收到请求调用HandlerMapping处理器映射器
  11. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  12. DispatcherServlet调用HandlerAdapter处理器适配器
  13. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
  14. Controller执行完成返回ModelAndView
  15. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  16. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  17. ViewReslover解析后返回具体View
  18. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
  19. DispatcherServlet响应用户

    拦截器

    对请求进行拦截处理,作用跟过滤器相似
    默认三个方法:1.预处理 2.后处理 3.请求完成

    RestFul风格

    对同一资源的操作,接口路径应该相同,通过请求方式区分操作行为,然后通过路径进行传参

  20. 查询 :get请求

  21. 新增 :Post请求
  22. 修改 :Put请求
  23. 删除 : Delete请求

    springMVC常用注解

    1. 请求路径,url地址:
    2. @RequestMapping
    3. @GetMapping
    4. @PostMapping
    5. @PutMapping
    6. @DeleteMapping
    7. 请求参数:
    8. @RequestParam
    9. @RequestBody
    10. @PathVariable
    11. 响应结果:
    12. @ResponseBody

    Mybatis实现原理

    框架 - 图3
    框架 - 图4

    ${} 和 #{} 的区别

  24. ${} 不能防SQL注入,但是可以识别关键字,一般用来传递表名,字段名等

  25. {} 有效防止SQL注入,但无法识别关键字,传递参数时使用 #{}

    RequstType 和 RequstMap

  26. RequstType 简单的数据表关系,属性名与字段名一一对应

  27. RequstMap 复杂的数据表关系,可以通过 requstmap 将属性名与字段名一一对应,同时也可以使用 association 和 collection 为嵌套对象和集合赋值

    mybatis的多参数处理

  28. 直接传参(一一对应)

  29. @Param(一一对应)
  30. javaBean(根据属性名获取参数)
  31. map(根据 key 值获取参数)

    mybatis的动态sql

  32. where(开启条件语句, 去掉条件语句中第一个or或and)

  33. set(开启set语句, 去除set语句中末尾的逗号)
  34. 分支控制: if, chose-when-otherwise(相当于switch-case-default), foreach(遍历)
  35. trim(prefix 指定前缀, suffix指定后缀, prefixOverrides 去除指定前缀, suffixOverrides去除指定后缀)

    mybatis的一级缓存和二级缓存

    一级缓存: 指sqlsession缓存, 作用域默认为当前sqlsession。
    作用: 同一个sqlsession中, 执行相同的sql查询语句时, 第一次会进入数据库查询并写入缓存, 第二次以后就是直接去缓存中取(若两次执行sql查询之间发生了DML操作, mybatis会把SqlSession的缓存清空)
    一级缓存的作用域有session和statement两种, statement情况下每次执行完一个mapper中的语句都会将一级缓存清除
    二级缓存: 指mapper映射文件, 作用域为同一个nameSpace下的mapper映射文件内容, 多个sqlSession共享
    作用: 同一nameSpace下的查询语句二次执行时不再查询数据库, 直接读取缓存
  1. <!-- 开启二级缓存: 在mybatis.xml全局配置 -->
  2. <setting name="cacheEnabled" value="true"/>
  3. <!-- 开启二级缓存: 在*Mapper.xml单独开启 -->
  4. <cache></cache>
  5. <!-- 多个Mapper共用二级缓存: -->
  6. <cache-ref namespace="其他Mapper的 包名+文件名 "/>
  7. <!-- 个别查询关闭二级缓存: 在select标签中设置属性useCach值为false -->

当Mybatis与Spring整合后, 直接通过Spring注入Mapper的形式, 如果不是在同一个事务中每个Mapper的每次查询操作都对应一个全新的SqlSession实例, 这个时候就不会有一级缓存的命中, 但是在同一个事务中时共用的是同一个SqlSession

MyBatis常用注解

SpringBoot

自动装配原理

Spring Boot 默认使用 application.properties 或 application.yml 作为其全局配置文件
http://c.biancheng.net/spring_boot/auto-config.html

Spring Factories 机制

  1. spring-core 包里定义了 SpringFactoriesLoader 类,这个类会扫描所有 Jar 包类路径下的 META-INF/spring.factories 文件,并获取指定接口的配置
  2. 在 SpringFactoriesLoader 类中定义了两个对外的方法
    1. loadFactories() 方法能够获取指定接口的实现类对象
    2. loadFactoryNames() 方法能够根据接口获取其实现类类名的集合
  3. loadFactoryNames() 方法中 loadSpringFactories() 方法能够读取该项目中所有 Jar 包类路径下 META-INF/spring.factories 文件的配置内容,并以 Map 集合的形式返回

    自动配置的加载

  4. Spring Boot 自动化配置也是基于 Spring Factories 机制实现的,在 spring-boot-autoconfigure-xxx.jar 类路径下的 META-INF/spring.factories 中设置了 Spring Boot 自动配置的内容

  5. @SpringBootApplication 注解中 @EnableAutoConfiguration 注解是 SpringBoot 自动化配置的核心所在
  6. 它使用 Spring 框架提供的 @Import 注解通过 AutoConfigurationImportSelector类(选择器)给容器中导入自动配置组件
  7. AutoConfigurationImportSelector 内顺序执行了三个方法

    SpringBoot常用注解

    约定大于配置的理解

    yml文件和properties的区别

    SpringCloud

    什么是微服务

  8. 把项目根据功能拆分为多个可以独立运行、部署的小项目

  9. 是面向服务开发(SOA)的一种落地方案

好处

  1. 实现分而治之
  2. 实现松耦合
  3. 高可用、高并发、高扩展

    SpringCloud +Alibaba

  4. 注册中心 :实现服务的治理(注册、发现、剔除) —(Nacos)

  5. 服务调用 :实现服务的远程调用 —(OpenFeign)
  6. 网关中心 :实现服务的聚合并完成请求过滤 —(Gateway)
  7. 熔断降级 :实现服务的熔断降级和流量控制 —(Sentinel)
  8. 链路跟踪 :实现服务的请求的日志记录 —(Sleuth + Zipkin)
  9. 配置中心 :实现配置的动态改变 —(Nacos)

    Nacos

    核心作用 :

    1. 注册中心
    2. 配置中心

通过访问 :8848/nacos 查看服务列表

OpenFeign

核心作用 :实现服务的远程调用,实现负载均衡
@EnableFeignClients :启用OpenFeign(写在开关类上)
@FeignClient :调用远程服务(写在接口上)

如何实现远程调用和负载均衡

  1. 项目初始化过程中,会为所有加了@FeignClient的service接口结合FeignClientFactoryBean生成对应接口的代理对象,客户端调用接口时会调用SynchronousMethodHandler的invoke方法。
  2. 调用servcie接口时是通过 client.execute(request, options) 调用的
  3. execute() ->executeWithLoadBalancer() ->submit() ->server为null的时候,执行selectServer() ->getServerFromLoadBalancer() -> getLoadBalancer()获取到要负载的对应接口的服务列表 -> chooseServer() 根据 key 值选择服务(key 值代表的就是策略,默认为轮询)

负载均衡策略

  1. 轮询
  2. 随机
  3. 权重
  4. hash
  5. 最小并发请求

    Gateway

    核心作用 :

  6. 实现服务的路由匹配(对外暴露统一的接口,然后进行跳转匹配)

  7. 实现请求的过滤处理

    Sentinel

    核心作用 :

  8. 设置接口的请求上限,实现流量控制

  9. 实现熔断降级,防止核心接口异常时导致服务器雪崩

    Sleuth

    核心作用 :

  10. 记录请求的时间

  11. 监控服务链路调用