画布 1
框架
  SpringMVC
    工作流程
    springMVC 的常用注解
    springMVC 是线程安全的？
    springMVC是什么
  MyBatis
    什么是 Mybatis？
    mybatis 的特点？
    mybatis 框架原理
    mybatis 和 hibernate 的区别？
    mybatis 有哪些 动态标签 ？
    mybatis 的 的 mapper.xml 中的#{} 和${}
    mybatis 分页如何处理
    如何获取自动生成的( 主) 键值?
    在 mapper 中如何传递多个参数?
    使用 MyBatis 的 的 mapper 接口调用时有哪些要求？
    简单 的说下 一下 MyBatis 的一级缓存和二级缓存？
  spring 框架知识
    Spring 框架的理解？
    spring 的优点？
    spring 的 IOC 原理？
    spring 的 AOP 原理？
    spring 中 AOP 的使用场景
    Spring 中动态代理实现方式
    Spring 框架中的单例 Beans 是线程安全的么
    Spring 如何处理线程并发问题？
    Spring 中bean 的自动装配
    @Autowired 和@Resource 之间的区别
    Spring 框架中都用到了哪些设计模式
    如何实现 spring 事务管理器
  Spring Boot
    什么是 spring boot
    springboot 的@SpringBootApplicaiton 注解作用
    springboot 项目启动发生了什么？
  Spring Cloud
    什么是微服务架构？
    什么是 spring cloud
    spring cloud 常用组件
    spring cloud 与zookeeper 有什么区别？
    SpringBoot和SpringCloud的区别？
    说说 RPC 的实现原理
1、客户端给服务器发送请求，前端控制器会捕获到请求
2、根据请求会判断他有没有配置内容，没有就返回404
3、有，调用handlerMapping获得配置内容，返回处理器链的形式返回
4、前端控制器获取处理器后，找到其适配器
5、执行prohandler方法
6、适配器找到处理这个请求的具体处理器
7、具体处理器处理完毕后，会返回给适配器ModelAndView对象
8、适配器返回给前端控制器ModelAndView对象
9、执行posthanlder方法
10、前端控制器根据ModelAndView对象找到对应的视图解析器
11、视图解析器解析对象，并返回Model，View对象给前端控制器
12、前端控制器渲染视图
13、执行aftercompeletion方法
14、将结果返回给客户端
@RequestMapping
@RequestBody
@PathVariable
@ResponseBody
@RequestParams
线程安全
1、Spring的bean对象是单例模式
spring的功能扩展，可以是spring的web模块
（1）Mybatis 是一个半 ORM（对象关系映射）框架，它内部封装了 JDBC，开发时只需要关注 SQL 语句本身，不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql，可以严格 控制 sql 执行性能，灵活度高。
（2）MyBatis 可以使用 XML 或注解来配置和映射原生信息，将 POJO 映射成数据库中的记录，避免了几乎所 有的 JDBC 代码和手动设置参数以及获取结果集。
（3）通过 xml 文件或注解的方式将要执行的各种 statement 配置起来，并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句，最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。 （从执行 sql 到返回 result 的过程）。
优点：
1、封装了jdbc的大部分内容，让代码解耦
2、与众多数据库兼容
3、基于sql语句，使用灵活，便于统一管理
4、能与spring很好的整合
缺点：
1、基于sql的编写，要求开发人员sql语句编写功底有要求
2、移植性差，不便于更换数据库
使用场景：
（1）MyBatis 专注于 SQL 本身，是一个足够灵活的 DAO 层解决方案。
（2）对性能的要求很高，或者需求变化较多的项目，如互联网项目，MyBatis 将是不错的选择。
1、读取sqlMapConfig文件，创建配置对象
2、根据配置对象，生成会话工厂
3、会话工厂生产一次会话，这个会话是开发人员操作数据库的接口
4、会话中底层的Excutor接口操作数据库
5、底层通过MappedStatement进行对数据的操作
1、MB需要人员自己写sql
2、MB灵活度高
3、H可节省很多代码，提高效率
1、if条件判断
2、where
3、sql子语句
#{}：占位符 取值
￥{}：连接符，不做解析，用于拼接sql，有sql注入风险
1、通过limit限制
2、通过插件pageHelper
3、mybatisPlus分页
useGeneratedKeys="true" keyProperty="id"
在dao接口上@Params("XXXX")指定参数的名称然后在xml中用#{XXXX}来获取
1、接口方法和xml文件定义的id值相同
2、接口方法参数和xml文件定义的parameterType类型相同
3、接口方法返回值和xml文件定义的resultType相同
4、xml文件的namespace值与mapper接口的路径一致
mybatis一级缓存默认开启
mybatis首先回去结果集中查找是否有匹配的，有就不走数据库
内部使用一个hashmap，key为hashcode+sqlId+sql语句，value为从查询出来映射生成的java对象
二级缓存为查询缓存，作用域是一个mapper中的namespace，二级缓存可以跨sql会话，一个namespace中查询sql可以从缓存中拿
Spring是一个轻量级的IOC、AOP容器框架。目的简化企业级应用程序的开发，让开发人员注重于业务需求。
常见配置方式：xml配置、注解、Java配置
主要由以下几个模块组成：
SpringCore：核心类库，提供ioc服务
SpringContext：提供框架式bean访问方式
SpringAOP：AOP访问
SpringDao：对JDBC的抽象，简化对数据库访问
SpringORM：对现有的ORM框架支持
SpringWeb：基于Web综合特性，文件上传等
SpringMVC：面向Web应用的Model-View-Controller实现
1、低入侵式设计，代码污染极低
2、提供AOP技术，可用于日志、权限、事务等进行集中式管理，提供更好复用
3、对主流应用框架提供继承支持
4、DI机制将对象之间的依赖交给框架处理，减少组件耦合
IOC 就是控制反转，原来我们需要创建对象的，必须自己 new，但是现在有了 spring 容器，我们不需要再自己 new
了，有两个好处，解耦，因为对象自己 new 完之后，无法更改,如果依赖对象发生异常，则会对我们自己的类造成影响。
springIOC，用户只需要进行配置，容器会在容器中自动实例化依赖对象，并且是单例模式，直接通过@autowired
直接注入即可。
IOC 主要是通过反射实现，底层原理大概是这样的：
1、项目启动，加载 web.xml；
2、在 web.xml 根据 context-param 通过 contextListener 加载 spring 上下文，
加载 spring 配置文件；
3、我猜，spring 可能通过 dom4j 解析 xml 配置文件；
4、获取 bean 标签，一旦发现 bean 标签，则读取 class 属性；
5、通过反射，Class.forName，获取该类的 class 字节码对象；
6、调用通过 Constructor 的 newInstance()实例化对象；
7、说 IOC 就离不开 DI，所谓 DI 是依赖注入，spring 的依赖注入有两种方式：
构造注入和 setter 注入；
8、所谓构造注入，就是读取<bean>标签的<constract-arg index="" value="">,
通过 class 字节码文件对象，获取构造参数；
9、通过 Constructor，直接构造对象，并对依赖对象进行初始化；
10、setter 注入，就是通过反射的<property name="" value="">;
11、通过 Field，设置依赖对象的属性值，dom4j 读取 property 标签的 name 和 value 属性值，
根据 name 获取 Field 成员，一般来说会通过 setAccessible 暴力破解，然后通过 set 方法，
指定 field 的对象和属性值，完成 setter 注入。
总结：以上就是对于 spring 的 IOC 和 DI 的理解，大概就是通过反射和 dom4j 完成控制反转和依赖注入。
Spring 的 IOC 有三种注入方式 ：构造器注入、setter 方法注入、根据注解注入。
AOP，一般称为面向切面，作为面向对象的一种补充，用于将那些与业务无关，但却对多个对象产生影响的公共
行为和逻辑，抽取并封装为一个可重用的模块，这个模块被命名为“切面”（Aspect），减少系统中的重复代码，
降低了模块间的耦合度，同时提高了系统的可维护性。可用于权限认证、日志、事务处理。AOP 实现的关键在于 代理模式，AOP 代理主要分为静态代理和动态代理。静态代理的代表为 AspectJ；动态代理
则以 Spring AOP 为代表。
（1）AspectJ 是静态代理的增强，所谓静态代理，就是 AOP 框架会在编译阶段生成 AOP 代理类，因此也称为编
译时增强，他会在编译阶段将 AspectJ(切面)织入到 Java 字节码中，运行的时候就是增强之后的 AOP 对象。
（2）Spring AOP 使用的动态代理，所谓的动态代理就是说 AOP 框架不会去修改字节码，而是每次运行时在内存
中临时为方法生成一个 AOP 对象，这个 AOP 对象包含了目标对象的全部方法，并且在特定的切点做了增强处理，
并回调原对象的方法。
Spring AOP 中的动态代理主要有两种方式，JDK 动态代理和 CGLIB 动态代理：
①JDK 动态代理只提供接口的代理，不支持类的代理。核心 InvocationHandler 接口和 Proxy 类，
InvocationHandler 通过 invoke()方法反射来调用目标类中的代码，动态地将横切逻辑和业务编织在一起；接着，
Proxy 利用 InvocationHandler 动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
②如果代理类没有实现 InvocationHandler 接口，那么 Spring AOP 会选择使用 CGLIB 来动态代理目标类。
CGLIB（Code Generation Library），是一个代码生成的类库，可以在运行时动态的生成指定类的一个子类对象，
并覆盖其中特定方法并添加增强代码，从而实现 AOP。CGLIB 是通过继承的方式做的动态代理，因此如果某个
类被标记为 final，那么它是无法使用 CGLIB 做动态代理的。
（3）静态代理与动态代理区别在于生成 AOP 代理对象的时机不同，相对来说 AspectJ 的静态代理方式具有更好
的性能，但是 AspectJ 需要特定的编译器进行处理，而 Spring AOP 则无需特定的编译器处理。
InvocationHandler 的 invoke(Object proxy,Method method,Object[] args)：proxy 是最终生成的代理实例; method
是被代理目标实例的某个具体方法; args 是被代理目标实例某个方法的具体入参, 在方法反射调用时使用。
1、权限
2、缓存
3、日志
4、内容传递
5、错误处理
6、懒加载
7、调试
8、跟踪、优化
9、性能优化
10、持久化
11、资源池
12、同步
13、事务
JDK 动态代理只能为接口创建动态代理实例，而不能对类创建动态代理。需要获得被目标类的接口信息（应用 Java
的反射技术），生成一个实现了代理接口的动态代理类（字节码），再通过反射机制获得动态代理类的构造函数，
利用构造函数生成动态代理类的实例对象，在调用具体方法前调用 invocationHandler 中的 excute()方法来处理,在
如果想要对被代理类进行增强可以在执行 method.invoke()方法前和后做代码处理，之前处理叫前切，之后处理叫
后切，同时还可通过 method 获取信息,如访问修饰符、全类名、方法名、返回值类型和参数列表，作为是否对方
法进行处理的判断条件，也就是我们说的切点；
实现 JDK 动态代理，只需要：
1、定义动态代理处理类，实现 InvocationHandler 接口，通过构造参数接收被代理类对象实例；
2、重写 excute()方法，在方法中，通过反射执行被代理被对象的方法 method.invoke();
3、method.invoke（）方法需要两个参数，一个是被代理类对象引用，一个是方法参数；
4、在方法执行前可以判断切点条件，在方法执行后，可以做资源处理；
5、在生成代理对象前，需要获取被代理类的 classloader 类加载器和接口集，及动态代理类对象
实例；
6、代码：Proxy.newProxyInstance( --生成动态代理对象
obj.getClass().getClassLoader(),--获取被代理类对象的类加载器
obj.getClass.getInterfaces(), --获取被代理类对象的接口
handler --实现了 InvocationHandler 的动态代理处理器，用于生成动态代理对象
);
实现原理：
在被代理类执行方法前，进行拦截，有和代理对象实现了相同接口的，被代理对象执行方法，
并进行扩展处理；
Spring 框架并没有对单例 bean 进行任何多线程的封装处理。关于单例 bean 的线程安全和并发问题需要开发者自行去搞定。但实际上，大部分的 Spring bean 并没有可变的状态(比如 Serview 类和 DAO 类)，所以在某种程度上说 Spring 的单例 bean 是线程安全的。如果你的 bean 有多种状态的话（比如 View Model 对象），就需要自行保证线程安全。最浅显的解决办法就是将多态 bean 的作用域由“singleton”变更为“prototype”。
在一般情况下，只有无状态的 Bean 才可以在多线程环境下共享，在 Spring 中，绝大部分 Bean 都可以声明为
singleton 作用域，因为 Spring 对一些 Bean 中非线程安全状态采用 ThreadLocal 进行处理，解决线程安全问题。
ThreadLocal 和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”
的方式，仅提供一份变量，不同的线程在访问前需要获取锁，没获得锁的线程则需要排队。而 ThreadLocal 采用
了“空间换时间”的方式。
ThreadLocal 会为每一个线程提供一个独立的变量副本，从而隔离了多个线程对数据的访问冲突。因为每一个线
程都拥有自己的变量副本，从而也就没有必要对该变量进行同步了。ThreadLocal 提供了线程安全的共享对象，
在编写多线程代码时，可以把不安全的变量封装ThreadLocal。
在 spring 中，对象无需自己查找或创建与其关联的其他对象，由容器负责把需要相互协作的对象引用赋予各个对
象，使用 autowire 来配置自动装载模式。
在 Spring 框架 xml 配置中共有 5 种自动装配：
（1）no：默认的方式是不进行自动装配的，通过手工设置 ref 属性来进行装配 bean。
（2）byName：通过 bean 的名称进行自动装配，如果一个 bean 的 property 与另一 bean 的 name 相同，就进行
自动装配。
（3）byType：通过参数的数据类型进行自动装配。
（4）constructor：利用构造函数进行装配，并且构造函数的参数通过 byType 进行装配。
（5）autodetect：自动探测，如果有构造方法，通过 construct 的方式自动装配，否则使用 byType 的方式自动装
配。
基于注解的方式：
使用@Autowired 注解来自动装配指定的 bean。在使用@Autowired 注解之前需要在 Spring 配置文件进行配置，
<context:annotation-config />。在启动 spring IoC 时，容器自动装载了一个 AutowiredAnnotationBeanPostProcessor
后置处理器，当容器扫描到@Autowied、@Resource 或@Inject 时，就会在 IoC 容器自动查找需要的 bean，并装配
给该对象的属性。在使用@Autowired 时，首先在容器中查询对应类型的 bean：
如果查询结果刚好为一个，就将该 bean 装配给@Autowired 指定的数据；
如果查询的结果不止一个，那么@Autowired 会根据名称来查找；
如果上述查找的结果为空，那么会抛出异常。解决方法时，使用 required=false。
@Autowired 可用于：构造函数、成员变量、Setter 方法
(1) @Autowired 默认是按照类型装配注入的，默认情况下它要求依赖对象必须存在（可以设置它 required 属性为 false）。
(2) @Resource 默认是按照名称来装配注入的，只有当找不到与名称匹配的 bean 才会按照类型来装配注入。
(3)前者使用与spring框架，后者可移植性强
1、工厂模式：BeanFactory，用于创建对象的实例
2、单例模式：Bean默认都是单例模式
3、代理模式：AOP技术
4、模板方法：减少代码重复，RestTemplete，JmsTemplete等
5、观察者模式
（1）编程式事务管理,在代码中调用 beginTransaction()、commit()、rollback()等事务管理相关的方法，这就是编程式事务管理。
（2）基于 TransactionProxyFactoryBean 的声明式事务管理
（ 3 ） 基 于 @Transactional 的 声 明 式 事 务 管 理 ,spring 配 置 文 件 中 配 置 TransactionManager ， 配 置
<tx:annonation-driven />，开启注解式事务管理
（4）基于 Aspectj AOP 配置事务
基于Spring的脚手架工程，提高开发效率
1、利用Maven管理依赖
2、约定大于配置，配置以及自动配置，需要修改就去配置文件里修改设置你需要的配置内容
3、自带了一个tomcat容器
@SpringBootApplication
包含了三个注解
@Configuration：配置类
@EnableAutoConfiguration：自动开启默认配置
@ComponentScan：组件扫描，当前包和下面的子包
1、执行启动类里面的main方法
2、扫描所有配置类，ioc装配
3、加载依赖，自动配置默认配置
4、打包成jar包，通过内部tomcat发布项目
按照业务行划分服务单元，每个微服务都可以独立运行，自治，满足复杂的业务需求
由许多技术组成整合到一起如：配置中心，注册中心，熔断器、服务调用、服务总线、服务发现、负载均衡、路由转发等
注册中心：Eureka、nacos
网关：zuul、gateway
负载均衡：ribbon
服务调用：openfeign
熔断器：hystrix
配置中心：nacos、config
消息总线：bug，nacos
zookeeper注重一致性
springcloud注重高可用性
cloud基于sringboot，他是各个技术的集合，关注全局服务框架
boot，可以独立运行，没个服务都可以有，将spring快速整合，专注单个微服务
首先要有网络连接，实现序列化和反序列化，通过网络远程调用服务