SpringBoot学习经验
SpringBoot
各位读者朋友你好,我是你的好朋友IT黑铁,在最近一段时间内我学习了关于Spring的相关知识,今天继续分享学习经验,如有错误,还望指正!
学习途径:@黑马程序员Bilibili视频
解决问题
自动配置,简化开发。
起步依赖
辅助功能
相关注解
@SpringBootTest(设置Junit加载的SpringBoot启动类,可以使用properties设置临时属性,args可以设置命令行参数,WebEnvironment设置web启动环境)
@DurationUnit(jdk8提供的基本单位注解)
@DataSizeUnit(容量单位注解)
@Validated(开启对当前bean属性注入校验,配合@Max、@Min等使用)
@AutoConfigureMockMvc(开启虚拟MVC调用,配合自动装配MockMvc对象和MockMvcResultMatchers对象测试使用)
@Transcational(测试类默认回滚,不提交事务,如不要回滚,则设置@Rollback)
@Rollback(设置是否回滚)
@BeforeEach(每个方法运行前都执行)
@AfterEach(每个方法运行后都执行)
@EnableCaching(开启缓存功能)
@Cacheable(存储返回值到缓存中或从缓存中读取数据)
@CachePut(将返回值存储到缓存中)
@EnableScheduling(开启SpringTask定时任务功能)
@Scheduled(指定时间)
@EnableAdminServer(以SpringBootAdmin方式启动服务)
@EndPoint(定义自定义端点)
@ReadOperation(当读取端点时,调用标注方法)
@EnableConfigurationProperties(设置加载Properities类为bean)
执行流程
SpringApplication构造流程
获取Bean Definition源
推断应用类型(根据类路径下的类推断web、非web、reactive,例根据dispatchServlet推断web类型)
ApplicationContext初始化器(通过读取配置文件扩展初始化内容,也可使用SpringApplication的addInitializers方法添加)
监听器与事件(与楼上相同,同时也可使用SpringApplication的addListeners方法添加)
主类推断(推断Main方法的类是哪个类)
注意:此时还未创建ApplicationContext,只是准备工作,当执行该类的run方法时才创建ApplicationContext。
执行run方法(12步骤)
得到SpringApplicationRunListeners(非监听器,而是事件发布器,分别在各阶段发布starting、environmentPrepared、contextPrepared、contextLoaded、started、running、failed事件,再在各个步骤响应这些事件,因为该接口的实现类是通过读取SpringFactories文件,所以可以使用SpringFactoriesLoader.loadFactoryNames根据key找值)
封装args
加载系统环境变量(ApplicationEnvironment对象,可以使用其getPropertySources().addLast()方法加入资源文件或命令行来源,通过getProperties方法获得键值信息)
解析多种格式的键值书写(向ApplicationEnvironment对象中通过ConfigurationPropertySources.attach方法加入该源)
系统环境变量的后置增强(EnvironmentPostProcessor接口,读取springFactories文件中的实现类,有实现类ConfigDataEnvironmentPostProcessor,通过其postProcessEnvironment方法执行该后处理器获得其他源;又一实现类RandomValuePropertySourceEnvironmentPostProcessor,获得随机源)
绑定资源文件对象(绑定必要的springApplication对象的属性,@ConfigurationProperties的底层,通过Binder.get().bind(指定类型).get()获得绑定并创建对象,通过Binder.get().bind(Bindable.ofInstance(指定对象))绑定已有对象)
Banner(通过SpringApplicationBannerPrinter的有参构造指定资源加载器和Banner对象,最后通过其print方法输出banner。另外可以自定义banner,在ApplicationEnvironment中加入键值(固定spring.banner.location(文字)),(spring.banner.image.location(图片)),版本号可以通过SprinBootVersion.getVersion()获得)
创建容器
准备容器(调用初始化器的initialize方法)
加载bean定义(使用AnnotatedBeanDefinitionReader的register方法加载配置类的bean定义,XMLBeanDefinitionReader的loadBeanDefinitions方法加载XML配置的bean定义,ClassPathBeanDefinitionScanner的scan方法扫描包)
refresh容器
执行runner(两个接口CommandLineRunner、ApplicationRunner,执行器run方法,第二个接口是需要通过DefaultApplicationArguements封装参数)
定时任务
解决问题:实现预定事件执行指定任务的功能。
具体实现:第一种方式:使用java的Timmer。第二种方式:使用Quartz。
第三种方式使用SpringTask。
Quartz:
划分概念:
具体操作:创建工作类继承QuartzJobBean,定义JobDetail的bean(绑定具体的工作类,使用JobBuilder,其返回JobDetail,并且需要调用storeDurably方法,使该工作持久化不被回收),定义Trigger的bean(在其中使用CronScheduleBuilder.cronSchedule创建调度器指定时间,再使用TriggerBuilder绑定工作明细和调度器)。
封装Starter
效果:将一个扩展功能封装为一个starter以便被其他程序使用。
具体实现:完成功能实现->定义业务配置属性类并将主配置文件中的属性设置绑定到该对象即使用@ConfigurationProperties->完成拦截器开发->yml提示(使用SpringBoot配置处理器打包编译后生成一个spring-configuration-metadata.json文件,有了文件后放到META-INF目录下再将该处理器坐标再去掉)
相关依赖
maven-resources-plugin(解析资源文件占位符,通常还需配置<configuration><encoding>utf-8</encoding><useDefaultDelimiters>true</useDefaultDelimeters></configuration>)
spring-boot-devtools(热部署工具,<optional>true</optional>,手动热部署使用Build Project(Ctrl F9)。自动热部署使用Ctrl+alt+shift+/,允许compiler.automake.allow.when.app.running。重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器。重载(Reload):jar包,加载位置base类加载器。热部署是Restart,重启项目是两个都有。另外注意:默认重启的目录有/META-INF/maven,/META-INF/resources,/resources,/static,/public,/templates)
validation-api(用于校验bean属性注入,配合其实现hibernate-validator使用)
spring-boot-starter-jdbc(内置持久化解决方案——jdbcTemplate)
spring-boot-admin-starter-client&spring-boot-admin-starter-server(分别是SpringBootAdmin客户端程序和服务器程序的依赖)
ip-spring-boot-starter(统计访问网站的主机ip信息)
spring-boot-configuration-processor(SpringBoot配置处理器)
相关知识
SpringBoot中4级配置文件为file:config/application.yml、file:application.yml、classpath:conig/application、classpath:application.yml,优先级从高到低。
SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0,需要在url连接串中配置时区,或在MySQL数据库端配置时区解决此问题。
SpringBoot内嵌Tomcat没有jsp解析器,若要使用内嵌Tomcat则加入Tomcat-embed-jasper,scope为provided。
H2数据库,SpringBoot内嵌数据库,java语言编写,需在SpringBoot配置文件中配置H2管理控制台参数(为其设置console属性的path和enabled),其访问用户名为sa密码默认123456。
HikariCP,SpringBoot内嵌数据源,其较为特殊配置url放在类型外层。
Redis,内存级NOSQL键值对解决方案,解决某些数据无需进入数据库的问题,也就是能够解决远程缓存问题。
Mongodb,开源、高性能、无模式的文档型数据库,解决修改频度极高的场景。
ES,分布式全文搜索引擎,解决搜索文档内容的快速匹配问题。
Simple是SpringBoot默认缓存解决方案,其他还有Redis、Ehcache、memcached等等。
jetCache是一个缓存框架,提供多种功能,支持的缓存技术较少(4个)。
j2cache也是一个缓存框架。
SpringBoot整合JavaMail,简化了JavaMailSender对象 的初始化。
三种异步消息传递技术:JMS、AMQP、MQTT。JMS(是一种规范):peer-2-peer、publish-subscribe两种消息模型,消息种类多种,其实现ActiveMQ、Redis、RabbitMq、RocketMQ等等(但没有完全遵守)。AMQP(是一种协议,约定数据格式):direct exchange、topic exchange等消息模型,统一消息种类为byte[],其实现有RabbitMQ、RocketMQ。MQTT:针对小型物联网设备。Kafka:其中一功能能够高吞吐量的分布式发布订阅消息系统,提供实时消息。
监控:监控服务状态,监控服务运行指标,监控日志,管理服务。Spring Boot Admin,用于管理和监控SpringBoot应用程序,需要两个应用程序,一个以服务端启动的web程序来监控,一个以客户端启动的受监控程序,然后在客户端SpringBoot配置文件中管理该admin和management。其原理是:SpringBoot内置了一个请求地址actuator,包括了各种程序信息成为端点,默认web访问大部分未开显示,而JMX则可以全看到。其端点info可以通过info配置信息,也可以通过实现InfoContributor接口添加信息;端点health可以实现AbstractHealthIndicator接口。端点Merics,通过为业务类提供有参构造方法(参数为MeterRegistry,方法中通过该参数对象获得Counter对象)和Counter计数器成员,然后在每一个监控具体业务方法中将计数器对象自增。自定义端点使用@EndPoint注解定义。
关于Java
java -jar 执行jar包工程,可以添加临时配置多级属性用点连接,需要依赖springBoot插件。
Timmer对象提供定时任务功能。
jconsole java提供的监控平台JMX