Spring的IOC和DI
- IOC :控制反转,将对象的创建销毁等交由外部容器
DI :依赖注入,将类作为属性注入到另一个类中(本质就是聚合)
Spring的AOP
AOP :面向切面编程(基于动态代理实现),对切点匹配到的方法在不改变源码的基础下进行增强处理
- 切入点表达式 : execution(* 包名.类名.方法名(..)) 用来匹配对应的方法
通知 :增强处理的内容
实例化Bean对象
- 设置Bean的属性
- 注入Aware的依赖
- 执行通用方法的前置处理 :BeanPostProcessor.postProcessorBeforeInitialization()
- 执行InitalizingBean.afterPropertiesSet()方法
- 执行Bean自定义的初始化方法init,或者 @PostConstruct 标注的方法
- 执行方法BeanPostProcessor.postProcessorAfterInitialization()
- 创建对象完毕
销毁
- 执行 DisposableBean.destory() 方法
- 执行自定义的destory方法或者 @PreDestory 标注的方法
- 销毁对象完毕
Spring 涉及的设计模式
- 工厂模式 :BeanFactory
- 单例模式 :Spring Bean 默认单例
- 适配器模式 :Spring AOP 使用Advice(通知)来增强被代理类的方法
- 代理模式 :Spring AOP基于JDK动态代理实现
- 包装器模式 :
- 模板方法模式 :
- 策略模式 :
-
spring常用注解
//声明Spring Bean(控制反转)
@Component
@Service
@Repository
@Controller
@Resource
//依赖注入
@Autowired
//aop 相关
@Aspect //切面
@PointCut //切点
@After //前置通知
@Before //后置通知
@Around //环绕通知
@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持)
SpringMvc的运行流程
用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
- DispatcherServlet调用HandlerAdapter处理器适配器
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
-
拦截器
对请求进行拦截处理,作用跟过滤器相似
默认三个方法:1.预处理 2.后处理 3.请求完成RestFul风格
对同一资源的操作,接口路径应该相同,通过请求方式区分操作行为,然后通过路径进行传参
查询 :get请求
- 新增 :Post请求
- 修改 :Put请求
-
springMVC常用注解
请求路径,url地址:
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
请求参数:
@RequestParam
@RequestBody
@PathVariable
响应结果:
@ResponseBody
Mybatis实现原理
${} 和 #{} 的区别
${} 不能防SQL注入,但是可以识别关键字,一般用来传递表名,字段名等
{} 有效防止SQL注入,但无法识别关键字,传递参数时使用 #{}
RequstType 和 RequstMap
RequstType 简单的数据表关系,属性名与字段名一一对应
RequstMap 复杂的数据表关系,可以通过 requstmap 将属性名与字段名一一对应,同时也可以使用 association 和 collection 为嵌套对象和集合赋值
mybatis的多参数处理
直接传参(一一对应)
- @Param(一一对应)
- javaBean(根据属性名获取参数)
-
mybatis的动态sql
where(开启条件语句, 去掉条件语句中第一个or或and)
- set(开启set语句, 去除set语句中末尾的逗号)
- 分支控制: if, chose-when-otherwise(相当于switch-case-default), foreach(遍历)
- trim(prefix 指定前缀, suffix指定后缀, prefixOverrides 去除指定前缀, suffixOverrides去除指定后缀)
mybatis的一级缓存和二级缓存
一级缓存: 指sqlsession缓存, 作用域默认为当前sqlsession。
作用: 同一个sqlsession中, 执行相同的sql查询语句时, 第一次会进入数据库查询并写入缓存, 第二次以后就是直接去缓存中取(若两次执行sql查询之间发生了DML操作, mybatis会把SqlSession的缓存清空)
一级缓存的作用域有session和statement两种, statement情况下每次执行完一个mapper中的语句都会将一级缓存清除
二级缓存: 指mapper映射文件, 作用域为同一个nameSpace下的mapper映射文件内容, 多个sqlSession共享
作用: 同一nameSpace下的查询语句二次执行时不再查询数据库, 直接读取缓存
<!-- 开启二级缓存: 在mybatis.xml全局配置 -->
<setting name="cacheEnabled" value="true"/>
<!-- 开启二级缓存: 在*Mapper.xml单独开启 -->
<cache></cache>
<!-- 多个Mapper共用二级缓存: -->
<cache-ref namespace="其他Mapper的 包名+文件名 "/>
<!-- 个别查询关闭二级缓存: 在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 机制
- spring-core 包里定义了 SpringFactoriesLoader 类,这个类会扫描所有 Jar 包类路径下的 META-INF/spring.factories 文件,并获取指定接口的配置
- 在 SpringFactoriesLoader 类中定义了两个对外的方法
- loadFactories() 方法能够获取指定接口的实现类对象
- loadFactoryNames() 方法能够根据接口获取其实现类类名的集合
loadFactoryNames() 方法中 loadSpringFactories() 方法能够读取该项目中所有 Jar 包类路径下 META-INF/spring.factories 文件的配置内容,并以 Map 集合的形式返回
自动配置的加载
Spring Boot 自动化配置也是基于 Spring Factories 机制实现的,在 spring-boot-autoconfigure-xxx.jar 类路径下的 META-INF/spring.factories 中设置了 Spring Boot 自动配置的内容
- @SpringBootApplication 注解中 @EnableAutoConfiguration 注解是 SpringBoot 自动化配置的核心所在
- 它使用 Spring 框架提供的 @Import 注解通过 AutoConfigurationImportSelector类(选择器)给容器中导入自动配置组件
AutoConfigurationImportSelector 内顺序执行了三个方法
SpringBoot常用注解
约定大于配置的理解
yml文件和properties的区别
SpringCloud
什么是微服务
把项目根据功能拆分为多个可以独立运行、部署的小项目
- 是面向服务开发(SOA)的一种落地方案
好处
- 实现分而治之
- 实现松耦合
-
SpringCloud +Alibaba
注册中心 :实现服务的治理(注册、发现、剔除) —(Nacos)
- 服务调用 :实现服务的远程调用 —(OpenFeign)
- 网关中心 :实现服务的聚合并完成请求过滤 —(Gateway)
- 熔断降级 :实现服务的熔断降级和流量控制 —(Sentinel)
- 链路跟踪 :实现服务的请求的日志记录 —(Sleuth + Zipkin)
-
Nacos
核心作用 :
- 注册中心
- 配置中心
OpenFeign
核心作用 :实现服务的远程调用,实现负载均衡
@EnableFeignClients :启用OpenFeign(写在开关类上)
@FeignClient :调用远程服务(写在接口上)
如何实现远程调用和负载均衡
- 项目初始化过程中,会为所有加了@FeignClient的service接口结合FeignClientFactoryBean生成对应接口的代理对象,客户端调用接口时会调用SynchronousMethodHandler的invoke方法。
- 调用servcie接口时是通过 client.execute(request, options) 调用的
- execute() ->executeWithLoadBalancer() ->submit() ->server为null的时候,执行selectServer() ->getServerFromLoadBalancer() -> getLoadBalancer()获取到要负载的对应接口的服务列表 -> chooseServer() 根据 key 值选择服务(key 值代表的就是策略,默认为轮询)
负载均衡策略