zoukankan      html  css  js  c++  java
  • 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常见问题解决方案:
    待续...

  • 相关阅读:
    java枚举
    [bzoj3436]小K的农场【差分约束系统】【判负环】
    [bzoj1085][SCOI2005]骑士精神【暴力】
    [bzoj1034][ZJOI2008]泡泡堂BNB【贪心】
    [bzoj1046][HAOI2007]上升序列【dp】
    [bzoj1050][HAOI2006]旅行comf【MST】
    [bzoj1047][HAOI2007]理想的正方形【单调队列】
    [bzoj1004][HNOI2008]Cards【群论】
    [bzoj1045][HAOI2008] 糖果传递【构造】
    [bzoj4589]Hard Nim【FWT】
  • 原文地址:https://www.cnblogs.com/skj0330insn/p/10510733.html
Copyright © 2011-2022 走看看