一、SSM
1.简单介绍一下Spring
Spring是一个一站式的轻量级的开源框架
一站式:在各个层都提供了解决方法
轻量级:本身架构很少,只占十几kb;跟其他框架整合时,代码耦合比较低
开源:代码托管到GitHub平台上
Spring是一个轻量级的控制反转IOC 和 面向切面编程AOP
IOC控制反转 去掉new对象的过程,将对象的生成交给Spring容器去执行,不等对象请求就主动将依赖传递给他。
AOP面向切面编程,Spring允许分离应用的业务逻辑来进行开发
Spring的五个核心:core、beans、context、spel、jcl
Spring的设计模式:
单例模式
工厂模式
适配器模式
二、SpringFramework
1.IOC
1.介绍IOC
IOC控制反转包括工厂+反射+配置文件
是面向对象编程的一种设计原则
最常见的是依赖注入,还有依赖查找
依赖注入DI:就是在使用Spring容器时,使用setter方法或者构造器来建立对象之间的依赖关系
2.IOC分类
XML版本
普通Bean的控制反转:id+class+name+scope
静态工厂的控制反转:id+class+factory-method
实例工厂的控制反转:id+factory-bean+factory-method
后处理bean:id+class+init-method+destory-method
注解版
@Component
@Controller
@Service
@Repository
@PostConstruct
@PreDestroy
3.DI依赖注入
XML版本:
简单类型的属性注入:
setter方法的属性注入
构造方法的属性注入
p命名空间的属性注入
spel表达式注入
自定义类型的属性注入
集合类型的属性注入:property、map、list、set、array
注解版本:
简单类型的属性注入:
@Value 方法级别的属性注入、参数级别的属性注入
自定义类型的属性注入:
@Autowired按照类型注入,如果没有该类型的属性,会抛异常
@Resource(name type)默认按照名称进行注入,如果没有该名称按照属性进行注入
2.AOP
1.介绍
AOP是面向切面编程,它可以说是一种思想。
利用AOP就可以将部分代码抽取出来
从而降低业务逻辑之间的耦合度,
提高代码的可重用性,
同时提高开发效率
2.AOP原理分析
如果要代理的对象实现了某个接口,就是基于jdk的动态代理,SpringAOP会使用JDKProxy去创建代理对象
如果代理对象没有实现接口,就是基于cglib的字节码增强,SpringAOP会生成一个代理对象的子类作为代理对象
3.项目中使用AOP
注解类
用作操作日志编写了规定的type+msg
写一个增强类
类被@Aspect+@Compoment修饰;
写 普通方法,没有方法体且被@PointCut("@annotation()")修饰
写普通方法,被@AfterThrowing(指定切入点表达式,抛出="ex")修饰 指定该方法是 异常增强
写普通方法,被@AfterReturning(指定切入点表达式,结果="") 修饰 指定该方法是 后置增强
写普通方法,handler(JoinPoint joinPoint,Object result,Integer status)
在每一项操作前增加@Log注解
4.Aop的基本概念:
- 目标类(target):需要进行功能扩展的类
- 连接点(joinPoint):目标类种的所有方法
- 切入点(pointCut):目标类种需要进行扩展的方法
- 增强(advise):需要进行的功能扩展
- 织入:将增强应用到切入点的过程
- 代理对象:织入后生成代理对象
- 切面:多个切入点形成一个面
5.增强:
前置增强:@Before
后置增强:@AfterReturning
环绕增强:@Around
异常增强:@AfterThrowing
最终增强:@After
3.SpringBean
1.Bean的作用域:
Singleton:单例 Spring默认的 唯一bean实例
Prototype:多例 每次请求都会创建一个bean实例
Request:在当前HTTP request内有 效。
Session:在当前 HTTP session 内有 效
GlobalSession:全局Session作用域
2.Bean的线程安全问题
当多个线程操作同一个对象的 时候,这个对象的非静态成员变量的写操作会存在线程安全问题:
解决办法:
1.在Bean对象中尽量避免定义可变的成员变量。
2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中。
3.@Component和@Bean的区别
@Component是类级别的注解、@Bean是方法级别的注解;
@Component是通过类扫描路径自动侦测和自动装配到Spring容器中,@Bean相当于告诉Spring这是这个类的实例
@Bean的引用范围更大,要引用第三方的类只能通过@Bean实现
4.Bean的生命周期
实例化Bean
Bean属性填充
初始化Bean
销毁Bean
实例化Bean对象-设置对象属性-检查Aware相关接口,如果实现就执行相关方法-BeanPostProcessor前置处理-@PostContrust-BeanPostProcessor后置处理-使用-@PreDestroy
5.Spring的设计模式
单例模式:Spring中的Bean是单例
工厂模式:BeanFactory
模板模式:用于解决代码重复的问题【jdbcTemplate、redisTemplate....】
代理模式:AOP原理
6.BeanFactory 和 ApplicationContext、FactoryBean的区别
1)三者都是接口,Application Context是Bean Factory的子接口;FactoryBean是一个工厂Bean,通过getBean()方法获取到的实例并不是他本身的实例,要使用getBean("&")方法才能获取到他自己的实例
2)在单例模式下:ApplicationContext在创建时就会实例化容器中的所有实例;BeanFactory在第一次调用getBean方法时实例化对象
3)在多例模式下,两者都是在调用getBean时实例化对象
7.SpringBean的自动装配方式
• byName:通过参数名自动装配,Spring 容器查找 beans 的属性,这些 beans 在XML 配置文件 中被设置为 byName。之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
• byType:通过参数的数据类型自动自动装配,Spring 容器查找 beans 的属性,这些 beans 在 XML 配置文件中被设置为 byType。之后容器试图匹配和装配和该bean的属性类型一样的 bean。如果有多个 bean 符合条件,则抛出错误。
• constructor:这个同 byType 类似,不过是应用于构造函数的参数。如果在BeanFactory 中不是恰好有一个 bean 与构造函数参数相同类型,则抛出一个严重的错误。
• autodetect:如果有默认的构造方法,通过 construct 的方式自动装配,否则使用 byType 的 方式自动装配。
8.单例Bean的创建方式:
饿汉式:初始化类的时候就定义了对象
懒汉式:定义对象的时候使用Synichronized关键字
9.ApplicationContext的两种实现
ClassPathXMLApplicationContext;FileSystemXMLApplicationContext
4.事务
1.什么是事务
事务是最小的逻辑单元,这组逻辑单元中要么同时成功要么同时失败
2.特点
原子性:事务时最小的逻辑单元
一致性:操作要么同时成功,要么同时失败
持久性:事务内的操作,一旦操作无法改变 因为修改了数据库
隔离性:事务内的操作相互独立
3.事务引发的问题
脏读:一个表读了另一张表未提交的内容
幻读:因为插入语句 多次读取的数据条数不一致
不可重复读:因为更新语句 多次读取的数据不一致
4.解决 隔离级别
只读不提交: 最低的隔离级别,可能会导致脏读、幻读或不可重复读
读并提交: 允许读取并发事务已经提交的数据,可以阻⽌脏读,但是幻读或不可重复读仍有可能发⽣ 【Oracle默认】
可重复读:对同⼀字段的多次读取结果都是⼀致的,可以阻⽌脏读和不可重复读,但幻读仍有可 能发⽣。【mysql 默认的 】
序列化: 最高的隔离级别,都解决, 这将严重影响程序的性能。
5.事务的传播行为
支持当前事务的情况
required:默认,如果当前有事务,在当前事务执行,如果当前没有事务,创建事务执行
supports:如果当前有事务,在当前事务执行,如果当前没有事务,就以非事务方式执行
mandatory 如果当前有事务,在当前事务执行,如果没有当前事务,就抛出异常。
不支持当前事务的情况:
requires_new:如果当前有事务,就将事务挂起,新建事务,如果当前没有事务,创建事务执行
not_supported:如果当前有事务,就将事务挂起,如果当前没有事务,就以非事务方式执行
never:如果当前有事务,就抛出异常,如果当前没有事务,就以非事务方式执行
其他:
nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就创建一个事务
6.pring是如何进行事务管理的
Spring是通过Aop进行事务的管理,它里面有两种可以通过编程式事务【通过注入TransationTemplate来实现但是它破坏了代码的业务逻辑】,声明式事务【@Transational(isolation="隔离级别",prapogation="传播行为")】
三、SpringMVC
1.简介
Spring Mvc 是控制层的Spring框架,替换Servlet,除了它以外,还有 struct1和 struct2
区别:
- struct1:被替代
- struct2:采用 prototype多例模式 每次请求都会产生一个Bean实例,会导致内存溢出 但是它保证成员变量的线程安全
- Spring Mvc:采用singleton单例模式 只生成一个SpringBean实例,成员变量需要考虑线程安全问题
2.SpringMVC 原理
1.客户端发送请求给DispatcherServlect前端控制器
2.DispatcherServlect前端控制器向handlerMapping处理器映射器发送请求
3.HandlerMapping处理器映射器向DispatcherServlect前端控制器发送**处理器执行链和拦截器链**
4.DispatcherServlect前端控制器向处理器映射器对应的HandlerAdapter处理器适配器发送请求
5.HandlerAdapter处理器适配器查找Handler处理器
6.Handler处理器执行handler
7.handler向HandlerAdapter处理器适配器返回ModleAndView
8.HandlerAdapter处理器适配器向DispatcherServlect前端控制器返回MadleAndView
9.DispatcherServlect前端控制器向ViewResolver视图解析器发送请求,帮助解析视图
10.ViewResolver视图解析器向DispatcherServlect前端控制器返回View
11.DispatcherServlect前端控制器会拿数据进行渲染,生成HTML静态代码
12.将静态代码发送到客户端进行响应
3.区别
1.@RestController和@Controller的区别
@Controller是同步请求,@RestController是异步请求;
@RestController = @Controller + @ResponseBody;
@Controller返回页面 @RestController返回JSON或XML形式的数据
2.拦截器和过滤器的区别
过滤器是基于函数回调的,拦截器是基于反射的;
过滤器可以过滤所有资源,拦截器只能拦截请求;
过滤器无法获取请求值栈中的信息,拦截器可以。
过滤器在请求生命周期中只能执行一次,而拦截器可以执行多次。
过滤器是依赖于servlet容器的,而拦截器不依赖servlet容器。
3.监听器和过滤器
八大监听器:
1)监听三个作用域的创建 和销毁:request、session、context
2)监听三个作用域中的属性的变化
3)监听session作用域的活化钝化;监听session的绑定和移除
4.SpringMVC如何处理统一异常
5.过滤器链的执行顺序
1)注解:@WebFilter:和@Order连用,order值越大越靠后执行;根据filterName的值的ASCLL值,升序执行
2)xml:filter的标签 filter filter-mapping,按照配置文件中filter的位置顺序,从上到下
拦截器和全局异常处理器:
- 拦截器
- 自定义LoginInterceptor implements HandlerInterceptor,重写三个方法,在preHandler方法里需要判断session中有没有存放用户,如果没有的话,就返回登录界面,如果有返回true
- 配置文件类中 MvcConfiger implements WebMvcConfig 通过@Bean注入LoginInterceptor,然后再重写 addInterceptors方法 通过参数registry.addInterceptor方法进行拦截
- <mvc:interceptors>
<!-- 设置单个拦截器 -->
<mvc:interceptor>
<!-- 设置拦截器的请求 -->
<mvc:mappingpath="/**"/>
<!-- 在拦截的基础上设置放行请求 -->
<mvc:exclude-mappingpath="/a"/>
</mvc:interceptor>
</mvc:interceptors>
- 全局异常处理器
- 自定义异常类MyException extends Exception :存放msg、code
- 自定义全局异常处理器 MyExceptionHandler implements HandlerExceptionResolver 重写方法,方法有一个参数是ex ,要判断这个ex是否是自定义的异常类 进行相关操作
- 如果注解整合SSM:
- 在MvcConfiger implements WebMvcConfig 也就是配置类 中重写 configureHandlerExceptionResolvers 方法 add(ex) ex是MyExceptionHandler类型的
- 如果XML整合SSM:
- <beanid="myExceptionHandler"class="com.sofwin.ex.MyExceptionHandler">
</bean>
SpringMVC如何处理统一异常:
• 方式一: 创建一个自定义异常处理器(实现 HandlerExceptionResolver 接口),并实现里面 的异常处理方法,然后将这个类交给 Spring 容器管理
• 方式二: 在类上加注解(@ControllerAdvice)表明这是一个全局异常处理类在方法上加注解 (@ExceptionHandler), 在 ExceptionHandler 中 有 一 个 value 属性,可以指定可以处理的异常类型。
4.主要注解
- @RequestMapping:方法级别和类级别的注解
类级别的注解:用于地址的前缀
方法级别的注解:用于地址的参数,不可重复
方法级别注解:
- @GetMapping,查询url映射
- @PostMapping,增加url映射
- @DeleteMapping,是一个删除url映射
参数级别注解:
- @PathVariable,获取路径参数,将动态值从url映射到方法参数
用法:delete/{id} 根据id 删除
- @RequestParam,用作不同名的请求参数的封装
用法:分页查询
@RequestParam(name = "pageNums",defaultValue = "1",required = true) Integer pageNums
- @RequestBody,实现接收 HTTP 请求的 json 数据,将 json 转换为 Java
- @ResponseBody,实现将 Controller 方法返回对象转化为 json 对象响应给客户。
@RequestBody 和 @ReponseBody:
前提:post请求,Data是JSON格式
@RequestBody:参数级别的,后端接收前端传来的JSON参数
[方法是@PostMapping修饰 就代表 传过来的是Json] 用法:新增修改的参数是User对象
@ReponseBody:方法级别的,后端传给前端JSON数据
Reful风格的请求: 以URL方式进行资源的传递
@RestController:返回json数据,而不是路径(相当于@ResponseBody),设置在Controller类上,里面的方法默认加上@ResponseBody注解
@PathVariable:路径变量,作用在方法的参数前,将URL中的参数映射到方法的参数上
@JsonFormat(pattern=“yyyy-MM-dd”,timezone=“GMT+8”):处理时间属性,设置在属性上。(因为json处理时间会有问题,所以利用这个注解解决)比如:出生日期 //timezone代表时间加8个小时(因为默认时间是伦敦时间)为中国时间
四、MyBatis
1.简介
Mybatis 是一款优秀的半自动化持久层框架,简单易学
MyBatis 为我们提供了全局配置文件和映射文件两大类
全局配置文件:Environments settings typeAlises plugins mappers
映射文件:resultMap association collection
select insert update delete where set sql include
为什么说mybatis是半自动orm映射工具?它与全自动的区别在哪里?
- 以Hibernate为例,它是全自动orm映射工具,它在查询关联对象或关联集合对象时,可以根据对象关系模型直接 获取,所以它是全自动的。
- 而mybatis进行查询时,需要手动编写sql,所以是半自动orm。
<Environments dev="">
<environment id="">
<transationManager type="JDBC"></transationManager>
<datasource type="POOLED">
<property name="" value=""></property>
<property ></property>
<property ></property>
<property ></property>
</datasource>
</environment>
</Environments>
<settings>
<setting name="" value=""></setting>//日志、缓存
</settings>
<typeAlises>
<typeAlise type="全限定类名" alise="别名"></typeAlise>
</typeAlises>
<plugins>
<plugin class="PageInterceptor">
<property name="" value=""></property>
</plugin>
</plugins>
<mappers>
<mapper class=""></mapper>
<package name=""></package>
</mappers>
<resultMap id="" type="映射的类的全限定类名">
<id column="" property=""></id>
<result column="" property=""></result>
1:1<association javaType="扩展类中的全限定类名或别名" property="扩展类中属性名">
1:n<collection ofType="扩展类中集合的泛型" property="扩展类中属性名"></collection>
</association>
</resultMap>
<select id="" paramterType="" resultType="" resultMap="">
<where>
<if test="">xxxx</if>
</where>
</select>
<insert id="" paramterType=""></insert>
<update id="" paramterType="">
<set>
<if test="">xxxx</if>
</set>
</update>
<delete id="" paramterType="">
<sql id>xxx</sql>
<include ref-id="">xxx</include>
</delete>
2.MyBatis原理
- SQLSessionFactoryBuilder 通过build()方法生成SQLSessionBuilde对象
- SQLSessionBuilde对象 通过openSession()方法 生成SQLSession接口
- sqlSession是接口,提供给工作人员的操作数据库的全部方法。它的实现分为:DefaultSqlSession和 SqlSessionManager
- sqlSession接口通过调用底层的Executor执行器,从而执行MapperStatement对象来达到操作数据库的目的。Executor执行器分为SimpleExector缓存执行器和BatchExecutor简单执行器ReUseExecutor
- MapperStatement对象就是包含了sql语句,输入参数类型和输出结果类型。
3.优缺点
1.优点:传统jdbc存在问题
- 数据库的频繁释放和链接 ------druid 池化技术
- 数据库存在硬编码问题 ------全局配置文件
- sql语句存在硬编码问题 ------映射文件
- jdbc查询结果需要封装 -----resultMap 和 resultType
2.缺点:
- sql语句的编写量大,特别是字段多或者进行多表关联查询时,对开发人员编写sql语句的水平有较高要求。
- sql语句依赖于数据库,导致数据库可移植性差,不能随意更换数据库。
4.#{}和${}的区别
#{} 表示占位符:数据是简单数据时,#{随便};自定义数据时,#{属性};表示Map数据时,#{key}
${} 表示字符拼符:数据是简单数据时,${value};自定义数据时,${属性};表示Map数据时,${key}
5.DAO接口和XML文件的关系
Dao接口就是xml对应的接口文件,需要满足
- 接口文件的位置==xml文件的namspace
- 接口文件的每个方法名==xml文件的sqlId
- 接口文件的方法的输入参数==xml文件中的该方法对应的sqlId的方法的paramType 如果存在多个输入参数,需要使用@Param修饰
- 接口文件的方法的输出结果==xml文件中的该方法对应的sqlId的方法的resultMap或者resultType
- 接口文件和配置文件同包同名---在springboot整合mybatis时,没有规定,但是需要在application.yml设置
Dao 接⼝的工作原理是 JDK 动态代理,Mybatis 运行时会使⽤ JDK 动态代理为 Dao 接⼝⽣成代 理 proxy 对象,代理对象 proxy 会拦截接⼝⽅法,转⽽执行 MappedStatement 所代表的sql,将 sql 执行结果返回。
6.mybatis动态sql - SQL注入
客户端拼SQL语句会生成
mybaits动态sql可以让我们在xml映射文件中,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
mybatis提供了9种动态sql标签:
where set trim if otherwise choose when foreach bind
动态sql的执行原理就是,使用ognl从sql参数对象中计算表达式的值,然后根据表达式的值动态拼接sql,以此来 完成动态sql的功能。 【 ognl:访问页面中的各种变量,进行结果输出 】
7.延迟加载
1.全局映射文件中
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2.映射文件中:
查询关联数据和关联集合数据的时候用到延迟加载
8.循环依赖
- A创建过程中需要B,于是**A将自己放到三级缓存**里面,去**实例化B**
- B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个**A放到二级缓存里面,并删除三级缓存里面的A**
- **B顺利初始化完毕**,将自己放到一级缓存里面(**此时B里面的A依然是创建中状态**)然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并**将A放到一级缓存**中。
9.MyBatis常用标签
五、Spring Boot
1.为什么使用SpringBoot
1.Spring的缺点
> 1. 体系越来越臃肿,导致学习成本过高。
> 2. Spring框架版本变更频繁。
> 3. 配置复杂。
> 4. 使用大量的反射机制,反射机制非常重用内存。
2.为什么要有Spring Boot?(什么是SpringBoot?)
> SpringBoot是在Spring的基础上产生的。Spring Boot提供了内置的应用服务器;核心是自动配置,所以允许通过Maven按需配置starter; SpringBoot内部对版本进行了兼容测试,我们在使用时无需注意版本,避免了繁琐操作,减少了我们的工作量。 另外它提供了运行时监控,是SpringCloud开发的基石。
2.自动配置原理
1.介绍@SpringBootApplication注解
> - 类级别的注解
> - 声明该类是一个启动类:普通类加上main方法,执行main方法里面的SpringApplication.run(App.class,args);
> - @SpringBootApplication是Spring Boot的核心注解,它主要包含了3个注
> - @SpringBootConfiguration,其中包含@Configuration注解,标注一个配置类
> - @EnableAutoConfiguration,开启或关闭自动配置功能。
> - @ComponentScan,用来扫描指定包下的所有组件。
2.Spring Boot的自动配置原理
> 1. SpringBoot在启动时会加载启动类,启动类中包含了@SpringBootApplication注解。
> 2. 该注解中包含了@EnableAutoConfiguration注解,用于开启自动配置。
> 3. 此注解中又包含@Import注解,导入组件,调用方法,执行getCandidateConfiguration方法。
> 4. 通过此方法获取配置列表,并扫描所有类路径下jar中的 META-INF/spring.factories,将其封装为property对象。
> 5. 最后将其中所有key为EnableAutoConfiguration的配置项注入到IOC容器中。
3.常用注解
- @SpringBootApplication
- @Configuration
- @EnableAutoConfiguration
- @ComponmentScan
- @Conditional
- @ConditionOnClass class条件注解
- @ConditionOnBean bean条件注解
- @ConditionOnField 属性条件注解 若满足条件加载,不满足不加载
4.配置文件
1.Spirng Boot常用的两种配置文件
> .properties结尾的配置文件 .yml或.ymal结尾的配置文件
> 我们推荐使用yml配置文件,轻量级的数据格式,缩进来描述数据和数据之间的层级关系。
> properties与yml的配置文件遵循“同名覆盖,异名互补”的原则。 它们之间的优先级关系是properties>yml>yaml。
2.什么是 YAML?YAML 配置的优势在哪里 ?
>数据序列化的格式方式 、可读性高的一种格式,以数据为中心。
>语法:
>- key + 冒号 + 空格 + value
>优势:
>- 使用缩进表示层级关系;
>- 配置有序,在一些特殊场景下,配置有序很关键;
>- 简洁明了,支持数组,数组中的元素可以是基本数据类型,也可以是对象
3.Spring Boot加载配置文件的优先级了解么?
>- 项目/config/配置文件
>- 项目/配置文件
>- 根目录src/config/配置文件
>- 根目录src/配置文件
4 多环境配置文件
>- 通过spring-profiles-active指定 激活指定的profile
>- 命令行的优先级大于配置文件的优先级
5.Spring Boot常用的读取配置文件的方法有哪些?
@Value :
> - 单一类型的属性注入
> - 然后在Ioc容器上直接使用@Value("${自定义属性}")
> - 不支持松散绑定
> - 不支持复杂类型的属性封装
> - 支持spel
> - 不支持数据校验
@ConfigurationProperties:
> - [spring-boot-configuration-processor]:
> - 引用类型的属性注入,
> - 在IOC容器上添加注解(只要交给spring IOC的类都 可以)
> - 支持松散绑定
> - 支持复杂类型的属性的封装
> - 不支持spel
> - 支持数据校验
5.SpringBoot对数据的访问
1.JDBC
1.添加依赖
spring-boot-starter-jdbc启动器
2.为DataSourceProperties配置数据源需要的信息:application.yml中添加
Driver、url、username、password
3.直接使用JdbcTemplate
2.Mybatis
1.添加启动器
mybatis-spring-boot-starter
2.mapper 在启动类的包 或者它的子包下面:
注解版:mapper类 添加@Mapper注解
方法添加@Select/@Insert/@Delete
映射文件版:启动类的@MapperScan
application.yml中添加mapper-locations
创建mapper.xml <select><insert><delect>
3.Mybatis-plus
1.添加依赖
mybatis-plus-boot-starter
2.在启动类上加注解@MapperScan("指定mapper的位置")
3.mapper 在启动类的包 或者它的子包下面:
实体类:@TableName //类级别的注解
@TableId //实体类主键字段
@TableField //非主键字段
Mapper接口:extends BaseMapper
4.JPA
1.什么是:Java持久层API。
2.解决了操作底层数据库的差异问题
3.jpa原理:将表和对象联系起来,引擎会根据数据库生成对应的语句
1.添加依赖spring-boot-starter-data-jpa
2.application.yml中添加配置
spring
jpa:
show-sql: true
hibernate:
ddl-auto:
create/update
3.实体类
@Entity
@Table 类级别的注解
@Id @GeneratedValue 自增主键
@Column 非主键列
4.DAO接口 extends JpaRepository<实体类,Id的类型>
5.热部署
spring-boot-devtools 重新加载restart类加载器中的信息。
6.缓存
1.在启动类或者配置类上开启 @EnableCaching
2.缓存用在业务层:
在进行缓存的方法上加注解
@Cacheable
@CachePut更新缓存 用于update方法上
@CacheEvict删除 缓存
7.thymeleaf视图
Spring Boot不仅可以编写Controller控制器接口,也可以开发Web页面
1.添加依赖
spring-boot-starter-themeleaf
2.application.yml添加配置
spring:
thymeleaf:
cache: false
3. classpath:/templates目录下添加 a.html
文档 使用
8.任务管理
1.定时任务
启动类:@EnableScheduling
方法:@Scheduled,配置 cron表达式。
2.异步任务
启动类:@EnableAsync
方法:@Async
9.健康监控
1.添加依赖
spring-boot-starter-actuator
10.swagger在线生成文档
1.添加依赖
springfox-boot-starter
2.启动类
@EnableSwagger2
3.配置类 implements WebMvcConfigurer
并添加注解 @EnableOpenApi
4.需要生成文件的类上添加注解
类:@Api
方法:@ApiOperation
参数:@ApiParam
实体类:@ApiModel
6.参数配置
boostrap.yml 和 application.yml
bootstrap.yml 和application.yml 都可以用来配置参数。
bootstrap.yml:配置一些引导系统启动的参数,这些参数一旦指定后就不会变动了。比如程序的端口号,配置中心的地址等。
application.yml:应用级别的参数配置,可能会根据业务需求做动态配置。比如日志级别,一些开关参数等。
优先级:bootstrap.yml > application.yml
7.jar
SpringBoot 打成的 jar 和普通的 jar 有什么区别 ?
- SpringBoot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,普通的jar的话不行
- SpringBoot打成的jar无法被其他项目依赖,普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
8.启动器
1.自己的
基础:spring-boot-starter 核心启动器
spring-boot-starter-logging 默认日志框架
spring-boot-starter-tomcat 默认tomcat服务器
监控:spring-boot-starter-actuator 启动器监控
技术:spring-boot-starter-aop 支持面向切面aop
spring-boot-starter-web 支持全栈式web开发
spring-boot-starter-test 支持常规测试
2.外部支持的
spring-boot-starter-data-jpa jpa整合
spring-boot-starter-jdbc 支持jdbc数据库
spring-boot-starter-redis 支持redis数据库
spring-boot-starter-security 支持spring-security
spring-boot-starter-thymeleaf 支持thymeleaf模板引擎
spring-boot-starter-jetty 支持jetty服务器,替换tomcat
spring-boot-starter-log4j 支持log4j日志框架
9.SpringBoot命令行启动
java -jar 执行jar包
--server.port 指定端口
--spring.profiles.active 指定 yaml 文件
六、SpringCloud
1.微服务
什么是微服务?
微服务架构是将一个应用程序开发为一组小型独立服务,这些独立服务在自己的进程中运行、独立开发和部署。
微服务的优势?
- 复杂的业务拆分成多个业务;
- 当需要增加业务时,方便扩展
- 如果其中一个宕机了,不会影响整个系统
- 每个微服务之间可以使用不同的编程语言和不同的数据库。
2.RPC
全称Remote Procedure Call, 即远程过程调用。
主要作用是实现调用远程方法就像调用本地方法一样,广泛应用于大规模的分布式应用中。
常见的RPC框架:
Dubbo SpringCloud
3.介绍SpringCloud
SpringCloud是一组微服务组件的集合。主要学的就是nacos、openfeign、sentinel、gateway
1.nacos
有三个功能
- 远程服务配置:
bootstrap.yml中添加配置;
配置dateId:远程配置文件的文件名-配置文件的环境.配置文件的后缀名
DataId=${spring.application.name}-${profiles.active}.${file-extension}
- 远程服务注册与发现:
增加依赖 spring-cloud-starter-alibaba-nacos-discovery ;
启动类增加注解@EnableDiscoveryClient
- 远程服务管理:双击E:\java\nacos\nacos-server\bin 的 startup.cmd 实现图形化界面
nacos如何实现动态配置?
- 需要动态刷新的类标注@RefreshScope 注解
- @RefreshScope 注解标注了@Scope 注解,并默认了ScopedProxyMode.TARGET_CLASS; 属性,此属性的功能就是在创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象
2.openfeign
声明式远程服务调用
使用:
- 启动类增加注解@EnableFeignClients
- @FeignClient(value="服务名")
- 接口的方法:
1)返回类型和参数和远程调用的服务一致
2)请求路径和远程调用的服务的请求路径一致
3)postMapping对应远程调用的服务的postMapping
3.sentinel
流量控制产品
限流、熔断、降级
Hystrix:断路器
限流算法:
限流就是限制流量。通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的。
1.计数器算法
- 例如系统规定一段时间内只能处理n个请求,保存一个计数器,每进来一个请求,计数器加一;请求结束,计数器减一
- 在规定的请求间隔时间内且请求数量没有超过限制就不进行限流;
- 在规定的请求间隔时间内,请求数量超过限制就进行限流;
2.漏桶算法
- 桶固定大小,桶不限制请求进入速率,但会限制请求处理速率(多余的请求会溢出),不论多少请求,最后处理请求的速率是不变的。
3.令牌桶算法
- 根据限流的大小,会设置按照一定的速率在桶中添加令牌。请求需要获得可用令牌才能够处理。请求处理完成后会将令牌进行删除。
- 桶满的时候,新添加的令牌会被丢弃和拒绝。
- 桶有最低限额,桶中令牌达到最低限额时,令牌将不会被删除。
服务熔断?服务降级?
在分布式系统中会依赖各种服务,当依赖的服务调用失败时,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,形成雪崩效应。Hystrix是防雪崩利器,提供了服务降级,服务熔断的方式:
服务熔断:当一定时间服务调用失败【报错、超时、宕机】达到一定的次数,才会启动服务熔断,进而调用服务降级方法快速响应。
服务降级:服务不可用以固定形式返回一定内容【牺牲某一服务模块,解决项目压力】
4.gateway
1.为什么要⽹关?
1,使用网关可以统一进行鉴权;
2,使用网关鉴权可以有效的保护微服务,只暴露自己的网关,将其他的微服务可以隐藏在内网中通过防火墙进行保护;
3,易于监控,可以在网关中直接统一收集监控数据并将其推送到外部系统进行分析;
4,减少客户端与各个微服务之间的交互次数.
2.你知道有哪些常⻅的⽹关系统?
1. Nginx:nginx是一个高性能的HTTP和反向代理web服务器,每个指令以;结束
2. getway:是spring出品,基于spring的网关项目,集成断路器,路径重写,性能要比zuul好
3. zuul: 是netfix出品的一个基于JVM路由和服务端的负载均衡器
网关
id、 uri: ip+端口 、predicates、filters
使用:
spring:
cloud:
gateway:
routes:
- id: baidu # 唯一标识
predicates:
- Path=/a
filters: - StripPrefix=1
- id: aqiyi
predicates:
- Path=/b
filters:
- StripPrefix=1
4.分布式ID
随着系统使用人数的增多,整个系统的数据量将越来远大,单表无法满足需求,需要分库分表 形成了分布式id
分布式ID的需求:
1)全局唯一
2)高性能
3)高可用
4)方便
分布式ID的形成策略
1)数据库:为数据库设置自增主键: 单独建了一个表来获取自增id作为消息的ID
2)UUID算法:JDK 中通过UUID的randomUUID()方法生成UUID;
3)雪花算法:由 64bit的二进制数字组成这 64bit 的二进制被分成了几部分,每一部分存储的数据都有特定的含义
4)Zookeeper:
5)Redis
5.SpringBoot和Spring Cloud的区别
Spring Boot 可以离开 Spring Cloud 独立使用,但是 Spring Cloud 离不开SpringBoot ,属于依赖的关系。
6.Spring Cloud和Dubbo的区别
1)服务调用方式:
• dubbo 是 RPC
• springcloud 是 Rest Api
2)注册中心:
• dubbo 是 zookeeper;
• springcloud 是nacos 注册中心也可以是zookeeper
3)服务网关:
• dubbo 本身没有实现,只能通过其他第三方技术整合;
• springcloud 有 gateway
4)断路器:
• dubbo不支持断路器
• springcloud 支持断路器
7.微服务之间如何独立通讯
• 同步通信:Dubbo 通过 RPC 远程过程调用、springcloud 通过 REST 接口 json调用 等。
• 异步通信:消息队列,如:RabbitMq、ActiveM、Kafka 等