SpringBoot主要知识点整理(持续更新~~~)
这篇笔记在云笔记中被保存了好久。偶然发现了一篇很好的文章,在复习的过程中发现这篇文章非常有帮助。(ΦωΦ)
springboot优点:
1.加快开发进程
2.无需配置主流开发框架集成
3.避免外部依赖并自主运行
4.实时监控应用运行状态
5.显著提升了开发部署效率
6.完美契合云计算架构
启动类@SpringbootApplication 是一个组合注解,主要的注解组成有@EnableAutoConfiguration、@Configuration、@ComponentScan :
@EnableAutoConfiguration:让springboot根据类路径下的jar包依赖进行自动配置
例如,添加了spring-boot-starter-web依赖,会自动添加tomcat和spring mvc 的依赖,那么springboot就会对tomcat和springmvc进行自动配置
Sptingboot会自动扫描@SpringbootApplication所在类的同级包以及下级包里的bean(若为JPA项目还可以扫描到@Entity的实体类)。建议将入口放在groupId+arctifactId的组合包名下
@Configuration:一般用来初始化配置类使用,通过@Configuration注解标注的类会在项目初始化的时候加载,也可理解为用spring的时候xml里面的标签
@ComponentScan告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。
配置资料:.properties应用或 application.yml 置于 src\main\resources 目录之下。
2.配置读取:
如果spring启动时没有读取配置文件,需在pom.xml文件里加:
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
AI写代码
Environment 的获取不仅限于从配置文件中解析注意:除了这些之外还可能来自其他途径(例如本地设备的环境变量设置等)

② @Value 读取

③ 对象映射方式

自定义配置文件可采用@PropertySource(“classpath:xxx.properties”)用于读取, 除了yml文件. 在多环境配置中进行选择.

4.配置文件的优先级:
①外置,在相对于应用程序运行目录的 /config 子目录中
②外置,在应用程序运行的目录中
③内置,放在config包下(即 src/main/resources/config)目录下
④内置,放在classpath根目录下(即默认的 src/main/resources/目录下)
上面的优先级是从高到低来的,即外置的改与内置的;config下面的高于根目录下的
(即应用外的配置文件优先于应用内,config目录下的优先于根目录下的)
bootstrap.yml(bootstrap.properties)先加载
application.yml(application.properties)后加载
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 由父Spring ApplicationContext加载。
父ApplicationContext 被加载到使用 application.yml 的之前
(是不是有点绕口,其实很好记)
调整环境选择的方式:
① 命令行参数
须知:在传入命令行参数时,请务必留意书写形式类似于 --key=value


②外置配置文件方式
4.加载自定义配置文件
指定根目录下配置文件名

5.配置内引用
①random随机数


②配置引用
使用 ${xxx} 来表示引用配置 xxx的值

- 配置动态刷新 通过Spring Cloud中的ContextRefresher类并在其中添加@RefreshScope注解

使用refresh()方法即可刷新

7.配置变更监听
利用springboot的事件通知机制,配置config变更的监听

二、日志篇
日志级别:trace<debug<info<warn<error<fatal
info 一般处理业务逻辑的时候使用,就跟 system.err打印一样,用于说明此处是干什么的。slf4j使用的时候是可以动态的传参的,使用占位符 {} 。后边一次加参数,会挨个对应进去。
debug: 一般放于程序的某个关键点的地方,用于打印一个变量值或者一个方法返回的信息之类的信息
error: 用户程序报错,必须解决的时候使用此级别打印日志。
warn:警告,不会影响程序的运行,但是值得注意
fatal: 重大错误
1.debug日志支持
默认是不输出debug日志的 ,如果需要,则需要在配置文件中添加 debug=true 属性;同样可以设置trace=true,就可以看应用输出的trace日志
2.log levels

logging.pattern.console = [thread](level value)%date{yyyy-MM-dd HH:mm:ss.SSS} - %logger{36} - [%msg]$n

4.输出文件

5.logback配置
①appender标签
a.class属性选择输出的地方

从数字0开始递增
从数字0开始递增
从数字0开始递增

②logger标签

自定义Bean的注入条件:
借助@Conditional注解配合Condition接口 ,为指定的Bean对象设置注入条件。通过这种方式实现对需要注入的Bean对象进行选择性注入。

满足条件则加载bean

也可加在类上

使用注解不需自己实现Condition接口

@ConditionalOnBean注解属性:
value:bean类型
type:bean类型
annotation:要求bean上拥有指定的注解
name:bean名称
@ConditionalOnProperty
prefix:配置前缀
havingValue:要求配置存在,且包含某个值
name:配置名
matchIfMissing:即便没有配置,也依然创建(true时)
2.多实例选择

当使用@Primary注解时:
若在 "@Resource" 注解中指定了 name,则可以通过指定 name 来查找相应的 Bean。
若采用 "@Autowired" 注解,则所有 Bean 必须标注为 @Primary 标识。
值得注意的是,《@Primary》注释要求唯一(在一个接口的子类中只能有一个实现类具有该注释)。
当未使用 @Primary 注解时:
若在 "@Resource" 注解中指定了 name,则可通过指定 name 来查找相应的 Bean。
若采用 "@Autowired" 注解,则需根据属性名查询对应的 Bean:若查询不到则会抛出异常;若有匹配结果则直接获取该 Bean。
对于同名 Bean 的解决方案主要有两种:
一种是明确指定其中一个 Bean 的名称;
另一种是选择性地排除某个同名 Bean 的自动加载机制。
四、AOP篇
1.基本概念:
① advice
before: 在方法执行之前被调用
after: 在方法执行之后调用
after returning: 方法执行成功之后
after throwing: 方法抛出异常之后
around: 环绕,自己在内部决定方法的执行时机,因此可以在之前之后做一些业务逻辑
② joint point
连接点,比如方法调用,方法执行,字段设置/获取、异常处理执行、类初始化、甚至是 for 循环中的某个点
但 Spring AOP 目前仅支持方法执行 (method execution) ,PointCut就是那个被拦截的方法
③ pointcut
切点,用来描述满足什么规则的方法会被拦截
④ aspect
切面是切点和通知的结合。通知和切点共同定义了关于切面的全部内容,它是什么时候,在何时和何处完成功能
⑤ introduction
引入允许我们向现有的类添加新的方法或者属性
⑥ weaving
生成一个代理类,在调用被拦截的方法时,实际上执行的是代理类,这个代理类内部执行切面逻辑
一个方法执行时,只要满足条件,多个相同或不同类型的advice都可以拦截
2.基本使用:

3.注解拦截方式

相同类型可都拦截


4.嵌套拦截
① 如果有切面的方法被没切面的方法调用,那他将不被拦截

在本类内部进行操作时,默认情况下若遇到符合条件的拦截机制,则不会触发跨日志(Cross-Subject Log)处理流程;而当调用来自其他组件的符合切面对策时,则会导致执行跨日志(Cross-Subject Log)处理流程。

③如果调用的方法上加了拦截的注解,则内部调用的方法全被正常拦截

小结:
a. 目标方法的执行;当调用本类中的一个满足切面规则的方法A时,在该方法A运行的过程中不会触发切面机制
b. 目标方法的执行;当调用其他类中的一个满足切面规则的方法B时,在该方法B运行的过程中将触发切面机制
5.AOP拦截作用域:
内部操作避免触发切面机制;不允许使用private关键字进行相关操作
6.AOP优先级:
①与当前一切面对应

② 多个层面,在同一装饰方式下 如为三个不同的类添加了@before注解,则这些类的处理顺序将按照其定义的方法名来确定

Order注解尝试
测试结果并未改变优先级


③不同切面间相同类型 advice
在A切面中提供的 advice 在同类型场景下将主导B切面中的 advice
借助 Order 标签机制能够实现这一目标,并且仍遵循数值越小表示优先等级越高
④不同切面上 advice 执行顺序
对于具有较高优先级的场景配置,在执行顺序上将覆盖较低优先级配置的结果
高优场景配置在执行时将覆盖所有低优配置的影响
五、JSQLException篇
查询:
单条查询:
①该查询方法返回一条记录,并将结果填入Map
②与前者的不同之处在于;该方法同样返回一条数据;但通过使用RowMapper组件可以实现对转换后的结果进行对象化的映射

或

特别注意:在某些情况下(如无匹配项),必须确保至少返回一条记录以避免系统崩溃。当无法找到相关数据时应抛出异常
- 新增功能模块:
执行基于指定表名的更新操作;
支持传递多个参数的一组更新操作;
通过新使用特定数据准备工具创建新记录;
配置新的数据提供器以实现动态绑定;
结合生成键持有器以确保完整性的更新操作;
生成并返回主键值以完成记录插入。

六、Feign篇
关于springCloud的有关整理还没做好,所以先把feign的放这:
启动类加@EnableFeignClients
Feign的源码实现的过程如下:
1.首先通过@EnableFeignCleints注解开启FeignCleint
2.根据Feign的规则实现接口,并加@FeignCleint注解
3.程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。
4.当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
5.RequesTemplate在生成Request
6.Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
7.最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
有个坑点:feign调用接口传递LocalDateTime值时会自动转化为上午下午的时间,无法解析(放在对象中传递无此问题)
