首页 > 其他分享 >重新认识Spring Boot

重新认识Spring Boot

时间:2022-11-14 22:32:54浏览次数:63  
标签:重新认识 依赖 spring 配置 boot 接口 Boot Spring


Spring Boot 的特性

  • 方便的创建可独立运行的Spring应用程序
  • 直接内嵌Tomcat、Jetty或Undertow
  • 简化了项目的构建配置
  • 为Spring及第三方库提供自动配置
  • 提供生产级特性
  • 无需生成代码或进行XML配置

Spring Boot的四大核心

  • 自动配置 - Auto Configuration
  • 起步依赖 - Starter Dependency
  • 命令行界面 - Spring Boot CLI
  • Actuator

自动配置

  • 基于添加的JAR依赖自动对Spring Boot应用程序进行配置
  • spring-boot-autoconfiguration

开启自动配置

  • @EnableAutoConfiguration
  • exclude = Class<?>[]
  • @SpringBootApplication

自动配置的实现原理

  • @EnableAutoConfiguration
  • AutoConfigurationImportSelctor
  • META-INF/spring.factories
  • org.springframework.boot.autoconfigure.EnableAutoConfiguration(spring-boot-autoconfigure-**.jar)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
geektime.spring.hello.greeting.GreetingAutoConfiguration
  • 条件注解
  • @Conditional
  • @ConditionalOnClass
  • @ConditionalOnBean
  • @ConditionalOnMissingBean
  • @ConditionalOnProperty
  • ……
  • 观察自动配置的判断结果
  • 启动调试参数:Program arguments:–debug
  • Positive matches 匹配的
  • Negative matches 不匹配的
  • Exclusions 排除的
  • Unconditional classes 无条件匹配
  • ConditionEvaluationReportLoggingListener
  • Positive matches
  • Negative mathches
  • Exclusions
  • Unconditional classes

手动实现自动配置

  • 编写Java Config
  • 标注:@Configuration
  • 添加添加
  • 标注:@Conditional
  • 定位自动配置
  • META-INF/spring.factories

条件注解大家庭(Spring 4引入)

  • 条件注解
  • @Conditional
  • 类条件
  • @ConditionalOnClass
  • @ConditionalOnMissingClass
  • 属性条件
  • @ConditionalOnProperty
  • Bean 条件注解
  • @ConditionalOnBean
  • @ConditionOnMissingBean
  • @ConditionOnSingleCandidate
  • 资源条件
  • @ConditionalOnResource
  • Web 应用条件
  • @ConditionalOnWebApplication
  • @ConditionalOnNotWebApplication
  • 其他条件
  • @ConditionalOnExpression
  • @ConditionalOnJava
  • @ConditionalOnJndi
  • 执行顺序
  • @AutoConfigureBefore
  • @AutoConfigureAfter
  • @AutoConfigureOrder

  • Spring Boot 错误分析机制
  • FailureAnalysis 类
  • 例如:ctrl + alt +B 找到DataSourceBeanCreationFailureAnalyzer

【扩展】spring 常用接口

  • Aware接口族
  • 各种Aware接口,方便从上下文中获取当前的运行环境
  • 常见的几个子接口有:
    BeanFactoryAware,BeanNameAware,ApplicationContextAware,EnvironmentAware,BeanClassLoaderAware等
  • InitializingBean接口和DisposableBean接口
  • InitializingBean:自定义的初始化方法或者做一些资源初始化操作
  • DisposableBean:可以添加自定义的一些销毁方法或者资源释放操作
  • ImportBeanDefinitionRegistrar接口
  • BeanPostProcessor接口和BeanFactoryPostProcessor接口
  • 这两个接口为Spring的Bean后置处理器接口,作用是为Bean的初始化前后提供可扩展的空间
  • BeanPostProcessor:
  • 针对Bean实例
  • 在Bean创建后踢狗定制逻辑回调
  • BeanFactoryPostProcessor:
  • 针对Bean定义
  • 在容器创建Bean前获取配置元数据
  • Java Config 中需要定义为static方法
  • BeanDefinitionRegistryPostProcessor 接口
  • BeanDefinitionRegistryPostProcessor 接口可以看作是BeanFactoryPostProcessor和ImportBeanDefinitionRegistrar的功能集合,既可以获取和修改BeanDefinition的元数据,也可以实现BeanDefinition的注册、移除等操作
  • FactoryBean接口
  • ApplicationListener

Maven依赖技巧

  • 了解你的依赖
  • mvn dependency:tree 命令
  • IDEA Maven Helper 插件
  • 排除特定依赖
  • exclusion
  • 统一管理依赖
  • dependencyManagement
  • Bill of Materials - bom
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.3.RELEASE</spring-boot.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

Spring Boot 的起步依赖

  • Start Dependencies
  • 直接面向功能
  • 一站获得所有相关依赖,不再复制粘贴
  • 官方的 Starters
  • 自己的 Starter
  • 主要内容
  • autoconfigure 模块,包含自动配置代码
  • starter 模块,包含指向自动配置模块的依赖及其他相关依赖
  • 命名方式
  • xxx-spring-boot-autoconfigure
  • xxx-spring-boot-starter
  • 注意事项
  • 不要使用 spring-boot 作为依赖的前缀
  • 不要使用 spring-boot 的配置命名空间
  • starter 中仅添加必要的依赖
  • 声明对 spring-boot-starter的依赖

外置化配置加载顺序

  • 开启 DevTools 时,~/.spring-boot-devtools.properties
  • 测试类上的@TestPropertySource注解
  • @SpringBootTest#properties属性
  • 命令行参数(–server.port=9000)
  • SPRING_APPLICATION_JSON 中的属性
  • ServletConfig 初始化参数
  • ServletContext 初始化参数
  • java:comp/env 中的JNDI属性
  • System.getProperties()
  • 操作系统环境变量
  • random.*涉及到的RandomValuePropertySource
  • application文件
  • jar 包外部的 application-{profile}.properties 或 .yml
  • jar 包内部的 application-{profile}.properties 或 .yml
  • jar 包外部的 application.properties 或 .yml
  • jar 包内部的 application.properties 或 .yml
  • 默认位置
  • ./config
  • ./
  • CLASSPATH 中的 /config
  • CLASSPATH 中的 /
  • 修改名字或路径
  • spring.config.name
  • spring.config.location
  • spring.config.additional-location
  • Relaxed Binding

命名风格

使用范围

示例

短划线分割

Properties 文件YAML 文件系统属性

geektime.spring-boot.first-demo

驼峰式

同上

geektime.springBoot.firstDemo

下划线分割

同上

geektime.spring_boot.first_demo

全大写,下划线分割

环境变量

GEEKTIME_SPRINGBOOT_FIRSTDEMO

  • @Configuration 类上的 @PropertySource
  • SpringApplication.setDefaultProperties()设置的默认属性

PropertySource

  • 添加 PropertySource
  • context:property-placeholder
  • PropertySourcesPlaceholderConfigurer
  • PropertyPlaceholderConfigurer
  • @PropertySource
  • @PropertySources
  • Spring Boot 中的 @ConfigurationProperties
  • 可以将属性绑定到结构化对象上
  • 支持 Relaxed Binding
  • 支持安全的类型转换
  • @EnableConfigurationProperties
  • 定制 PropertySource
  • 主要步骤
  • 实现 PropertySource
  • 从Environment 取得 PropertySources
  • 将自己的 PropertySource 添加到合适的位置
  • 切入位置
  • EnvironmentPostProcessor
  • BeanFactoryPostProcessor
  • 例子:官方JdbcProperties、RandomValuePropertySource

运行中的Spring Boot

Actuator

  • 目的:监控并管理应用程序
  • 访问方式:HTTP、JMX
  • 依赖:spring-boot-starter-actuator

常用 Endpoint

ID

说明

默认开启

默认HTTP

默认JMX

beans

显示容器中的 Bean 列表

Y

N

Y

caches

显示容器中的缓存

Y

N

Y

conditions

显示配置条件的计算情况

Y

N

Y

configprops

显示 @ConfigurationProperties 的信息

Y

N

Y

env

显示 ConfigurableEnvironment 中的属性

Y

N

Y

health

显示健康检查信息

Y

Y

Y

httptrace

显示HTTP Trace 信息

Y

N

Y

info

显示设置好的应用信息

Y

Y

Y

loggers

显示并更新日志配置

Y

N

Y

metrics

显示应用的度量信息

Y

N

Y

mappings

显示所有的 @RequestMapping 信息

Y

N

Y

scheduledtasks

显示应用的调度任务信息

Y

N

Y

shutdown

优雅地关闭应用程序

N

N

Y

threaddump

执行 Thread Dump

Y

N

Y

heapdump

返回 Heap Dump 文件,格式为 HPROF

Y

N

N/A

prometheus

返回可供 Prometheus 抓取的信息

Y

N

N/A

访问 Actuator Endpoint

  • HTTP 访问
  • /actuator/
  • 端口与路径
  • management.server.address=
  • management.server.port=
  • management.endpoints.web.base-path=/actuator
  • management.endpoints.web.path-mapping.=路径
  • 开启 Endpoint
  • management.endpoint..enabled=true
  • management.endpoint.enabled-by-default=false
  • 暴露 Endpoint
  • management.endpoints.jmx.exposure.exclude=
  • management.endpoints.jmx.exposure.include=*
  • management.endpoints.web.exposure.exclude=
  • management.endpoints.web.exposure.inclued=info,health


标签:重新认识,依赖,spring,配置,boot,接口,Boot,Spring
From: https://blog.51cto.com/u_688107/5851084

相关文章

  • Spring--依赖注入:setter注入和构造器注入
    依赖注入:描述了在容器中建立Bean于Bean之间依赖关系的过程setter注入在本来已经在service里面引用了bean的相关方法的基础上,再引用之前已经写过的userDao的对象,即在servi......
  • springAop的实现方式
    AOP的三种实现方式AOP是Spring中继IOC(面向切面编程)后又一十分重要的概念。AOP,即面向切面编程。使用AOP可以实现在不改变原有的业务逻辑的代码的情况下,在系统上增加一些特殊......
  • Spring--Bean的生命周期
    Bean的生命周期对于生命周期来说,每个对象都会有起初的初始化和最后的销毁,Bean也不例外;Bean的生命周期可以简述为:Bean的定义--Bean的初始化--Bean的使用--Bean的销毁所以......
  • Spring学习笔记(2)实现 Bean 的定义、注册、获取
    代码目录结构small-spring-step-02└──src├──main│└──java│└──cn.bugstack.springframework.beans│├─......
  • SpringMVC 项目中 创建SpringBoot后,引起的No bean named 'xxx' available
    ​参考:https://blog.csdn.net/weixin_44341110/article/details/115208375https://blog.csdn.net/qq_40929531/article/details/103956332 我是sessionFactory报错......
  • springboot框架中service层抽取增删改查并封装
    1、BaseService.javaimportcatl.mapper.BaseMapper;importtk.mybatis.mapper.entity.Example;importjavax.annotation.Resource;importjava.util.Collections;import......
  • 7.Gateway:Spring Cloud API网关组件(非常详细)
    在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,......
  • spring-boot-starter-webflux
    webflux:反应式编程reactor的产物,采用发布订阅模式,引入netty的nio,比较适合IO密集型应用。因普遍应用使用的DB链接是IO阻塞型,因此在一般应用中无法体现它的优势。redis和m......
  • springboot整合kafka
    maven配置:<properties><java.version>1.8</java.version><oracle.version>11.2.0.4</oracle.version></properties><!--kafka--><dependency>......
  • SpringBoot 05: 接口架构风格 + RESTful接口风格
    接口定义API(ApplicationProgrammingInterface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口,或指软件系统不同组成部分衔接的约定)是用来提供应用程序与开......