Len's Study-Log

集中一点,登峰造极!

0%

《SpringBoot编程思想》随笔


  • 传统web项目的运行模式:工程代码打包成war包,部署到tomcat服务器中。
  • SpringBoot运行模式:直接执行jar或war包。

【SpringBoot 主要有五大特性】:

  1. SpringApplication
  2. 自动装配
  3. 外部化配置
  4. SpringBoot Actuator
  5. 嵌入式Web容器

SpringBoot可执行JAR

前提条件:需要添加spring-boot-maven-plugin到pom.xml文件中。

mvn package指令将项目打包,生成jar包。

指令java -jar ***.jar可以运行springboot项目(开发阶段使用mvn spring-boot:run,两者效果是一样的)

java -jar运行SpringBoot项目原理分析

(打包后的jar的目录结构可以参照书本P34)

java -jar 引导的是标准可执行JAR文件,java官方规定,java -jar命令引导的具体启动类必须配置在MANIFEST.MF资源的Main-Class属性中。

同时,根据“JAR文件规范”,MANIFEST.MF资源必须存放在/META-INF/目录中。

实际项目中我们发现Main-Class属性指向的Class为org.springframework.boot.loader.JarLauncher,并且Start-Class属性中设定了SB项目的引导类(thinkinginspringboot.firstappbygui.FirstAppByGuiApplication)。

Start-Class属性并非Java平台标准MANIFEST.MF的属性,而是spring定义的,是JarLauncher/WarLauncher用来读取SB项目的启动类的。

JarLauncher的实现原理在书本P40-P54)

其实,通过java命令引导JarLauncher类文件,JarLauncher会在同进程内调用Start-Class类的main(String[])方法,并且在启动前准备好Class Path。

理解自动装配

  • SB激活自动化装配:将@EnableAutoConfiguration或者@SpringBootApplication标注在项目中随意一个@Configuration类上。
  • @SpringBootApplication的作用:激活@EnableAutoConfiguration、@Configuration、@ComponentScan三个注解的特性。
    • @EnableAutoConfiguration用于激活自动装配机制
    • @ComponentScan激活@Component的扫描
    • @Configuration声明被标记的类为配置类
  • @SpringBootApplication = @EnableAutoConfiguration + @Configuration + @ComponentScan
  • @SpringBootConfiguration中的@ComponentScan并不是拿默认配置的,ta添加了一个TypeFilter的排除的实现,排除了TypeExcludeFilter.class和AutoConfigurationExcludeFilter.class.
    • TypeExcludeFilter.class 用于查找BeanFactory中已注册的TypeExcludeFilter Bean,作为代理对象。
    • AutoConfigurationExcludeFilter.class用于排除其他同时标注了@Configuration和@EnableAutoConfiguration的类。

从SpringBoot 1.4 开始,@SpringBootApplication 注解不在标注@Configuration,而是@SpringBootConfiguration,两者并无差异。

@SpringBootApplication 属性别名

@SpringBootApplication 注解中多次用到了@AliasFor 这个注解。

@AliasFor 能够将一个或多个注解的属性“别名”在某个注解中
上面的“别名”我理解为“附加”
例如:
@SpringBootApplication(scanBasePackages = “thinking.in.spring.boot.config”)
这个原本是@ComponentScan 的 basePackages属性

@SpringBootApplication标注非引导类

引导类:又叫启动类,用于启动SpringBoot 项目的,一般命名方式为:项目名+Application

@SpringBootApplication可以放到非引导类上,也可以达成和放到引导类上一样的效果。

SpringBoot 自动配置机制

SB中,@Configuration声明被标记的类为配置类,它们会被SB装载,即使这些配置类是在外部的jar包中。当@ConditionOnClass 也标注在这种配置类上时,那么当且仅当该类存在于ClassPath下时才会被装载。

开发者怎么自定义自动装配类?

  1. 在resource 目录下创建 META-INF/spring.factories 资源。
  2. 在 spring.factories 中配置你要装配的类:(LibXAutoConfiguration类上需要加上注解@Configuration)
1
2
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration

注意:自动装配的类,一般用 AutoConfiguration作为后缀

SpringBoot Actuator

SpringBoot Actuator 用于监控和管理Spring 应用,可通过HTTP Endpoint 或JMX Bean 与其交互。

  • 使用场景:监视和管理投入生产的应用。
  • 监管媒介:HTTP或JMX端点。
  • 端点类型:审计、健康和指标收集。
  • 基本特点:自动运用。

SpringBoot Actuator Endpoints

actuator 提供了很多监管应用的endpoints(端点)。

常用端点:

  • beans:显示当前Spring应用上下文的Spring Bean 完整列表(包含所有ApplicationContext的层次)。
  • conditions:显示当前应用所有配置类和自动装配类的条件评估结果(包含匹配和非匹配)。
  • env:暴露 Spring ConfigurableEnvironment 中的PropertySource属性。
  • health:显示应用的健康信息。
  • info:显示任意的应用信息。

使用:

  1. 添加Maven依赖

    1
    2
    3
    4
    5
    6
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    </dependencies>
  1. 在spring-boot Maven插件的启动参数中添加配置属性,暴露beans 为Web Endpoint:

    1
    $ mvn spring-boot:run -Dmanagement.endpoints.web.exposure.include=beans

    执行请求:$ curl http://127.0.0.1:8080/actuator/beans | json_pp

再次向spring-boot Maven插件的启动参数中添加配置属性,暴露conditions和env的Web Endpoint:

1
$ mvn spring-boot:run -Dmanagement.endpoints.web.exposure.include=beans,conditions,env

执行请求:$ curl http://127.0.0.1:8080/actuator/conditions| json_pp

注解

@Bean

Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

@Import

@Import注解是用来导入配置类或者一些需要前置加载的类.

例子:https://blog.csdn.net/mamamalululu00000000/article/details/86711079