SpringBoot 学习笔记

SpringBoot 主要特性
    ①SpringBoot Starter : 将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;
    (起步依赖:吧具备某种功能的坐标打包到一起,并提供一些默认功能)
    ②使编码变得简单,SpringBoot采用JavaConfig的方式对Spring进行配置,并提供了大量的注解,极大的提高了工作效率。
    ③自动配置:SpringBoot 的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的Bean并配置它们
     (SpringBoot在启动的过程中,会自动的将一些配置类的Bean进行创建,并添加到IOC容器中)
    ④使部署变得简单,SpringBoot内置了三种Servlet容器,TOmcat,Jetty,undertow,我们只需要一个Java的运行环境就可以跑SpringBoot的项目了,SpringBoot的项目可以打成一个Jar包
SpringBoot配置文件
2.4.0之前版本,优先级properties>yaml,2.4.0之后的版本yaml>properties 
可以在配置文件中加上spring.config.use-legacy-processing=true 设置配置文件的优先级
属性注入常用注解
@Configuration 声明一个类作为配置类
@Bean 声明在方法上,将方法的返回值加入Bean容器
@Value 属性注入
@ConfigurationProperties(prefix ="jdbc" ) 批量属性注入
@PropertySource("classpath:/jdbc.properties") 指定外部属性文件,在类上添加
SpringBoot日志框架
Spring框架选择使用了JCL作为默认日志输出,而SpringBoot默认选择了SLF4J结合了LoaBack
日志框架:在构建时,是怎么样的一个构建设计思想?
通常下情况下,日志是由一个抽象层+实现层的组合来搭建的
统一日志框架使用步骤:
    ①排除系统中的其他日志框架。
        
    ②使用中间包替换要替换的日志框架。
        
            
    ③导入我们选择的SLF4J实现。
在SpringBoot 启动的过程中,是如何完成自动装配的,都把哪些组件进行了自动配置?
SpringBoot应用的启动入口是@SpringBootApplication注解标注类中的main()方法
@SpringBootApplication:SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main()方法启动SpringBoot应用
条件注解
    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean
    @ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
    @ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean.
    @ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean。基于SpEL表达式的条件判断。
    @ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化Bean。
    @ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean。
    @ConditionalOnNotWebApplication:不是web应用,才会实例化一个Bean。
    @ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
    @ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。
    @ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
    @ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
    @ConditionalOnResource:当类路径下有指定的资源时触发实例化。
    @ConditionalOnJndi:在JNDI存在的条件下触发实例化。
    @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。
SpringBoot在启动的过程中都会对哪些配置类里面的Bean进行自动装配?自动装配的底层原理又是什么?
    ①从META-INF/spring.factories配置文件中加载自动配置类。
    ②加载的自动配置类中排除掉@EnableAutoConfiguration注解的exclude属性指定的自动配置类。
    ③然后再用AutoConfigurationImportFilter接口去过滤自动配置类是否符合其标注注解(若有标注的话)@ConditionalOnClass,@ConditionalOnBean和@ConditionalOnWebApplication的条件,若都符合的话则返回匹配结果。
    ④然后触发AutoConfigurationImportEvent事件,告诉ConditionEvaluationReport条件评估报告器对象来分别记录符合条件和exclude的自动配置类。
    ⑤最后Spring再将最后筛选后的自动配置类导入IOC容器中。
HttpEncodingAutoConfiguration (Http编码自动配置)
@ComponentScan注解
    从定义的扫描路径中,找出标识了需要装配的类自动装配到Spring的Bean容器中
    常用属性:
        basePackages、value:指定扫描路径,如果为空则以@ComponentScan注解的类所在的包为基本的扫描路径
        basePackageClasses: 指定具体扫描的类
        IncludeFilters:指定满足Filter条件的类
        excludeFilter:指定排除Filter条件的类
run方法执行过程:
    ①启动获取监听器
        
        
        
    ②构建应用上下文环境
        
        
    ③初始化应用上下文
        
    ④刷新应用上下文前的准备
        
        
          
    ⑤刷新应用上下文
        
           
    SpringBoot内嵌tomacat启动过程
            
SpringBoot 缓存
    JSR107核心接口:
        CachingProvlder(缓存提供者):创建、配置、获取、管理和控制多个CacheManager
        CacheManager( 缓存管理器):创建、配置、获取、管理和控制多个唯一命名的Cache,Cache存在与CacheManager的上下文中,一个CacheManager仅对应一个CachingProvider。
        Cache(缓存):是由CacheManager管理的,CacheManager管理Cache的生命周期,Cache存在与CacheManager的上下文中,是一个类似map的数据结构,并临时存储以key为索引的值,一个Cache仅被一个CacheManager所拥有
        Entry(缓存键值对):是一个存储在Cache中的Key-value对
        Expiry(缓存时效):每一个存储在Cache中的条目都有一个定义的有效期。一旦超过这个时间,条目就自动过期,过期后,条目将不可以访问、更新和删除操作。缓存有效期可以通过ExpiryPolicy设置
缓存注解:
    Cache:缓存接口,定义缓存操作。实现有:RedisCache,EnChacheCache,ConcurrentMapCache等
    CacheManager:缓存管理器,管理各种缓存组件
    @Cacheable:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
    @CacheEvict:清空缓存
    @CachePut:保证方法被调用,又希望结果被缓存
    @EnableCaching:开启基于注解的缓存
    keyGenerator:缓存数据时Key的生成策略
    serialize:缓存数据时value序列化策略
说明:
    @Cacheable标注在方法上,表示改方法的结果需要被缓存起来,缓存的键由keyGenerator的策略决定,缓存的值的形式则由serialize序列化策略决定(序列化还是JSON格式);标注上该注解之后,在缓存时效内再次调用该方法时将不会调佣方法本身,而是直接从缓存获取结果
    @CachePut也是标注在方法上,和@Cacheable相似也会将方法的返回值缓存起来,不同的是标注@CachePut的方法每次都会被调用,而且每次都会将结果缓存起来,适用于对象的更新
@Cacheable:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
        value/cacheNames:指定缓存的名称,cacheManager是管理多个cache,以名称进行区分
        key:缓存数据时指定key值(key,value),默认是方法的参数值,也可以使用spEL来计算key的值
        keyGenerator:key的生成策略,和key进行二选一,自定义keyGenerator
        cacheManager:指定缓存管理器 redis/encache
        condition:条件属性,满足这个条件才会进行缓存
        unless:否定条件,满足这个条件,不进行缓存
        sync:是否使用异步模式进行缓存
                condition/unless 同时满足,不缓存
                sync的值为true的时候,unless不被支持
@Cacheable运行流程:
    ①方法运行之前,先去查询Cache(缓存组件),按照cacheNames指定的名字获取(CacheManager先获取相应的缓存,第一次获取缓存如果没有Cache组件会自动创建)
    ②去Cache中查找缓存的内容,使用的key默认就是方法的参数:
        key默认是使用keyGenerator生成的,默认使用的是SimpleKeyGenerator
        SimpleKeyGenerator生成key的默认策略:
            如果没有参数:key = new SimpleKey();
            如果有一个参数:key = 参数的值
            如果有多个参数:key = new SimpleKey(params);
    ③没有查到缓存就调用目标方法
    ④将目标方法返回的结果放进缓存中
总结:@Cacheable标注的方法在执行之前会先检查缓存中有没有这个数据,默认按照参数的值为key查询缓存,如果没有就运行方法并将结果放入缓存,以后再来调用时直接使用缓存中的数据。
核心:1、使用CacheManager(ConcurrentMapCacheManager)按照名字得到Cache(ConcurrentMapCache)组件
           2、key使用keyGenerator生成,默认使用SimpleKeyGenerator
SpringBoot 部署与监控
        SpringBoot项目默认打包成jar包,jar包方式启动,也就是使用SpringBoot内置的tomcat运行。服务器上只要配置了jdk1.8以上就OK,不需要外置的tomcat。
SpringBoot将项目打成jar包
1.首先在pom.xml文件中导入Springboot的maven依赖

 2.执行package

启动方式

java -jar XXX.jar

打成war包需要注意:部署到外部的tomcat中,这个时候,不能直接访问spring boot 项目中配置文件配置的端口。application.yml中配置的server.port配置的是spring boot内置的tomcat的端口号, 打成war包部署在独立的tomcat上之后, 配置的server.port是不起作用的。

 jar包和war包方式对比

1、jar更加简单方便,使用 java -jar xx.jar 就可以启动。所以打成 jar 包的最多。而 war包可以部署到tomcat的 webapps 中,随Tomcat的启动而启动。具体使用哪种方式,应视应用场景而定。

 2、打jar包时不会把src/main/webapp 下的内容打到jar包里 (你认为的打到jar包里面,路径是不行的会报404)。打war包时会把src/main/webapp 下的内容打到war包里

3、打成什么文件包进行部署与项目业务有关,就像提供 rest 服务的项目需要打包成 jar文件,用命令运行很方便。。。而有大量css、js、html,且需要经常改动的项目,打成 war 包去运行比较方便,因为改动静态资源可以直接覆盖,很快看到改动后的效果,这是 jar 包不能比的

多环境部署
@Profile注解:
@profile注解的作用是指定类或方法在特定的 Profile 环境生效,任何@Component或@Configuration注解的类都可以使用@Profile注解。在使用DI来依赖注入的时候,能够根据@profile标明的环境,将注入符合当前运行环境的相应的bean。
使用要求:
        @Component或@Configuration注解的类可以使用@profile
        @Profile中需要指定一个字符串,约定生效的环境
@Profile 可以修饰类,也可以修饰方法
 SpringBoot 监控
  Acturator:
        Actuator是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序。可以使用HTTP的各种请求来监管,审计,收集应用的运行情况。Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含:应用状态、内存、线程、堆栈等等,比较全面的监控了Spring Boot应用的整个生命周期。特别对于微服务管理十分有意义。
Actuator 的 REST 接口:
        Actuator 监控分成两类:原生端点和用户自定义端点;自定义端点主要是指扩展性,用户可以根据自己的实际应用,定义一些比较关心的指标,在运行期进行监控。
        原生端点是在应用程序里提供众多 Web 接口,通过它们了解应用程序运行时的内部状况。原生端点又可以分成三类:
        应用配置类:可以查看应用在运行期的静态信息:例如自动配置信息、加载的 springbean 信息、yml 文件配置信息、环境信息、请求映射信息;
        度量指标类:主要是运行期的动态信息,例如堆栈、请求链、一些健康指标、metrics 信息等;
        操作控制类:主要是指 shutdown,用户可以发送一个请求将应用的监控功能关闭。
Actuator 提供了 13 个接口,具体如下表所示。
        /auditevents:显示应用暴露的审计事件 (比如认证进入、订单失败)
        /beans:描述应用程序上下文里全部的 Bean,以及它们的关系
        /conditions:就是 1.0 的 /autoconfig ,提供一份自动配置生效的条件情况,记录哪些自动配置条件通过了,哪些没通过
        /configprops:描述配置属性(包含默认值)如何注入Bean
        /env:获取全部环境属性
        /env/{name}:根据名称获取特定的环境属性值
        /flyway:提供一份 Flyway 数据库迁移信息
        /liquidbase:显示Liquibase 数据库迁移的纤细信息
        /health:报告应用程序的健康指标,这些值由 HealthIndicator 的实现类提供        
        /heapdump:dump 一份应用的 JVM 堆信息
        /httptrace:显示HTTP足迹,最近100个HTTP request/repsponse
        /info:获取应用程序的定制信息,这些信息由info打头的属性提供
        /logfile:返回log file中的内容(如果 logging.file 或者 logging.path 被设置)
        /loggers:显示和修改配置的loggers
        /metrics:报告各种应用程序度量信息,比如内存用量和HTTP请求计数
        /metrics/{name}:报告指定名称的应用程序度量值
        /scheduledtasks:展示应用中的定时任务信息
        /sessions:如果我们使用了 Spring Session 展示应用中的 HTTPsessions 信息        
        /shutdown:关闭应用程序,要求endpoints.shutdown.enabled设置为true
        /mappings:描述全部的 URI路径,以及它们和控制器(包含Actuator端点)的映射关系        
        /threaddump:获取线程活动的快照
注意:
        其中只有shutdown是post请求,其他都是get请求
Spring Boot Admin
        什么是Spring Boot Admin
                Spring Boot Admin 是一个针对spring-boot的actuator接口进行UI美化封装的监控工具,他可以返回在列表中浏览所有被监控spring-boot项目的基本信息比如:Spring容器管理的所有的Bean、详细的Health信息、内存信息、JVM信息、垃圾回收信息、各种配置信息(比如数据源、缓存列表和命中率)等,Threads线程管理,Environment管理等。
利用Spring Boot Admin进行监控的架构图如下:
       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值