springboot学习小记

思维导图:https://www.edrawsoft.cn/viewer/public/s/72a06689197636

1.springboot是一个快速整合第三方框架,简化XML配置完全采用注解化,内置http服务器(jetty和tomcat),最总以java应用程序进行执行(默认端口8080)

2.@RestController表示该类中的所有方法返回json字符创(@Controller+@ResponseBody)

3.springboot启动
启动原理:springmvc注解方式启用,内置http服务器(默认是tomcat)
启动方式:@SpringbootApplication注解在含有main方法的根类上(最简单方式)

4.配置文件:
springboot项目的pom文件需要引入父类依赖spring-boot-starter-parent整合第三方常用框架依赖信息
springboot整合springmvc需要引入spring-boot-starter-web使用maven依赖继承关系整合
maven启动springboot项目需要指定jar的主函数入口spring-boot-maven-plugin

5.小项目使用AOP统一处理web请求日志(@Before/@After/@AfterReturning)
备注:小项目一般把日志半年左右迁移到云备份nosql数据库中。传统方法把日志写到磁盘上有很大缺点,可使用分布式日志收集系统(kafka/chukwa/Flume/Lagstash)

6.springboot创建GlobalException(加注解@ControllerAdvice(basePackages="com.it.conttoller")指定扫包范围)来捕获全局异常

7.lombok底层使用字节码技术ASM修改字节码文件生成get、set方法等,编译后还是会生成对应方法,简化代码(@Data=@Gatter+@Setter)
备注:下载好的jar包放到eclipse安装目录中,eclipse.ini最下面添加配置:-Xbootclasspath/a:lombok.jar -javaagent:lombok.jar,pom中加入依赖

8.使用@EnableAsync就可以使用多线程,写在@SpringBootApplication(spring项目启动类)或者@Configuration(spring项目配置类)上,AsyncRestTemplate异步非阻塞发送http请求

9.使用@Async就可以定义一个线程任务。通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线程池
--类内部调用不会实现异步(通过spring代理机制实现异步,类内调用不走代理机制),及@Async放在private方法上面不生效
--返回值为void和Future可以,返回对象为null,返回基本类型报错AopInvocationException

10.@Value自定义参数注入,项目启动时加载,加载顺序在static资源后面

11.spring项目多环境配置:多application-**.properties,单application.properties,通过spring.profiles.active=**指定项目使用的配置文件

12.springboot整合mybatis注意事项:mapper层不需要添加注解,但是一定要在启动类上加上@MapperScan(basePackages={"com.*.mapper1","com.*.mapper2"}),就不用在每个mapper上加@Mapper

13.springboot默认集成事务,只需要在方法上加@Transactional就行(不需要@EnableTractional),方法执行完才能在数据库看到效果
spring事务分类:声明事务和编程事务;事务原理:AOP技术环绕通知进行拦截;注意事项:不要try,抛出给外层

14.springboot整合多数据源:分包名和注解方式,需要自定义数据源连接信息
多数据源事务不能只写@Transactional,需要用@Transactional(transactionManager="**1")指定对应自定义数据源中的事务管理器

15.devtools热部署原理:使用类加载器(classloader)重新读取字节码文件到jvm内存,有2个classloader,一个加载不会改变的第三方jar包,一个加载会改变的类,代码修改后,第二个classloader被丢弃重新创建一个classloader,实现较快重启
手写热部署功能:监听class文件是否发生改变(版本号或者修改时间),如果class文件发生改变就是用classloader重新读取
热部署不推荐在生产环境使用(防止集群环境不同服务器读取的字节码不同,大项目会特别占用内存很卡),一般用于本地开发提高效率

16.springboot性能优化
1)扫包优化:默认使用@SpringbootApplication(等同@Configuration+@EnableAutoConfiguration+@ConponentScan)会触发自动配置和组件扫描(递归扫包),启动时间长,加载了多余的实例和CPU消耗
2)JVM参数调优(减少垃圾回收次数):-XX:+PrintGCDetails -Xmx512M -Xms512M(打印详细GC日志,最大堆内存和初始堆内存,默认4G),太小会频繁触发GC
设置方式:1.内部运行设置在eclipse中的VM agments设置;2.外部运行设置用 java server -Xms512M -Xms512M -jar xxx.jar
3)默认tomcat容器修改为undertow(tomcat吞吐量5000undertow8000)

17.监控中心
针对微服务服务监控,服务器内存变化(堆内存、线程、日志管理等)、监测服务配置连接地址是否可用(模拟访问、懒加载)、统计现在容器中
多少个bean、统计springmvc中@RequestMapping(统计http接口数)。
AdminUi底层使用Actuator监控(没有界面,返回json)实现可视化界面

18.@Scheduled(initialDelay=1000, fixedDelay=2000)实现定时任务
--集群/负载均衡环境使用Quartz单独出来一个项目
注意:1、在Application.java同级及子集路径下;2.Application上添加@EnableScheduling

19.@Cacheable、@CachePut、@CacheEvict、@CacheConfig
@CacheConfig:一次性声明@Cacheable()里面都有一个value=“xxx”的属性
@CachEvict:的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空
@CachePut:确保方法被执行,返回值记录到缓存中
@Cacheable:重复使用相同参数调用方法,方法本身不会被执行,方法的结果直接从缓存中找到
总结:@CachePut和@Cacheable这两个标签可以结合使用,当需要根据请求改变值的时候,利用@CachePut将值改变并写入到缓存中,而@Cacheable标签除了第一次之外,一直是取的缓存的值。注意结合使用时需要注意两点:
1、必须是同一个缓存实例。
2、key值必须是相同的。
注解失效时间+主动刷新缓存:https://blog.csdn.net/huanghongfei1/article/details/61195650
定时清除缓存: @Scheduled(cron="0 0,30,* * * ?")
@CacheEvict(cacheNames="aa",allEntries=true)
--集群环境可使用成熟缓存服务器,比如redis

springboot常见问题解决方案:
待续...

posted @ 2019-03-11 15:12  苏大大的园子  阅读(149)  评论(0编辑  收藏  举报