SpringBoot

Spring Boot 是一个基于 Spring 框架的开源 Java 开发框架,旨在简化 Spring 应用程序的初始搭建和开发过程。它通过提供默认配置和约定俗成的设置,大大减少了开发人员在项目配置和依赖管理上花费的时间,使开发人员能够更专注于业务逻辑的实现。

特点

  • 快速入门:
    • Spring Boot 提供了 Starter POMs,简化了 Maven 和 Gradle 项目的依赖管理。
    • 开发人员无需手动配置大量的 XML 文件或 Java 配置类,只需添加 Starter 依赖即可。
  • 自动配置:
    • Spring Boot 的核心功能之一是自动配置(Auto-configuration)。它会根据项目中添加的依赖自动配置 Spring 应用程序。
  • 嵌入式服务器:
    Spring Boot 内置了 Tomcat、Jetty 或 Undertow 等嵌入式 HTTP 服务器,无需单独部署 WAR 文件到外部服务器。
  • 生产就绪:
    • Spring Boot 提供了生产环境所需的功能,如性能指标、健康检查、外部化配置等。
    • 通过 Actuator 模块,可以轻松监控和管理应用程序。
  • 支持多种部署方式:
    • Spring Boot 应用程序可以打包成可执行的 JAR 文件,直接运行在命令行中。
    • 也支持传统的 WAR 文件部署到外部 Servlet 容器

配置优先级

SpringBoot支持多种格式的配置方式

  • 命令行参数:通过命令行传递的参数。例如:
    1
    java -jar myapp.jar --server.port=8086
  • java系统属性:通过 System.getProperties() 设置的系统属性。例如:
    1
    java -Dserver.port=8083 -jar myapp.jar
  • application.properties文件:
    例如
    1
    server.port=8081
  • 优先级:
    不同配置方式的优先级为:命令行参数>java系统属性>properties>yml>yaml

Bean管理

Bean 是由 Spring 容器管理的对象。它是 Spring 应用程序的核心组成部分之一,用于封装业务逻辑、数据访问、服务等功能。

获取Bean

  • 默认情况下,Spring项目启动时,会自动把Bean都创建好放在ioc容器中,如果想主动获取Bean,可以通过以下方法:
    • 根据name获取:Object getBean(String name)
    • 根据类型获取: getBean (Class requiredType)
    • 根据name获取(带类型转换): T getBean(String name,Class requiredType)

Bean的作用域

Spring支持五种作用域,后三种再Web环境中才生效:

  • 单例(singleton):
    • 默认作用域,整个应用程序中只有一个实例。
    • 适合无状态的 Bean。
  • 原型(prototype):
    • 每次请求都会创建一个新的实例。
    • 适合有状态的 Bean。
  • 请求(request):
    在 Web 应用程序中,每个 HTTP 请求都会创建一个新的实例。
  • 会话(session):
    在 Web 应用程序中,每个 HTTP 会话都会创建一个新的实例。
  • 应用(application):
    在 Portlet 应用程序中,每个 Portlet 应用程序都会创建一个新的实例。

可以通过添加@Scope注解来配置作用域

1
2
3
4
5
6
@Scope("prototype")
@RestController
@RequestMapping("/login")
public class doLogin(){

}

延迟初始化:加注解@Lazy,会延迟初始化Bean,直到第一次使用时才初始化

第三方Bean

  • 如果要管理的Bean对象来自第三方(不是自定义的),是无法使用@Component等注解来声明Bean的,需要用@Bean注解

  • 管理第三方Bean对象,建议对这些Bean集中管理,可以通过@Configuration注解声明一个配置类:

    1
    2
    3
    4
    5
    6
    7
    @Configuration
    public class CommonConfig{
    @Bean
    public ThirdPartyService thirdPartyService() {
    return new ThirdPartyService();
    }
    }

自动配置

Springboot的自动配置就是当Spring容器启动后,一些配置类、Bean对象就自动存入到ioc容器中,省去了手动声明

当运行一个 Spring Boot 应用程序时,自动配置的过程大致如下:

  • 加载依赖:
    Maven 或 Gradle 根据项目的 pom.xml 或 build.gradle 文件加载所需的依赖项。
  • 检测依赖:
    Spring Boot 自动配置机制会检测项目中存在哪些依赖项(如数据库驱动、Web 框架等)。
  • 应用条件注解:
    自动配置类上的条件注解会根据检测到的依赖项和其他条件来决定是否应用某个配置。例如,@ConditionalOnClass 注解会检查某个类是否存在于类路径中,@ConditionalOnMissingBean 注解会检查是否没有定义某个 Bean。
  • 创建和配置 Bean:
    如果条件满足,自动配置类会创建并配置相应的 Bean,这些 Bean 将被注册到 Spring 容器中。
  • 启动应用程序:
    最后,Spring Boot 启动应用程序,加载所有自动配置的 Bean,并运行应用程序。

原理

  • Springboot启动类有注解@SpringBootApplication,该注解由三个部分组成:
    • @SpringBootConfiguration:声明当前类是一个配置类
    • @ComponentScan:组件扫描,默认扫描当前启动类所在包及其子包
    • @EnableAutoConfiguration:Springboot实现自动配置的核心注解:
      • 该注解中封装了一个@Import注解,导入了一个接口AutoConfigurationImportSelector的实现类,该实现类实现了一个selectImports方法,方法返回值是一个数组,数组中是要导入ioc的类的全类名,方法中还加载了记录了要导入的配置类的文件
      • 并非文件中全部类都会被注入ioc,有的是利用注解按条件装配的

条件装配

  • @Conditional:按照一定的条件进行判断,在满足条件后才会注册对应的Bean对象到ioc容器中,可以放在方法上或类上
  • @Conditional有大量子注解,常见的有:
    • @ConditionalOnClass:判断环境中是否有对应类的字节码文件,有才注册Bean到ioc中
      • 通过name或Value属性指定类
    • @ConditionalOnMissingBean:判断环境中没有对应的Bean(根据类型或名称),没有才注册Bean到ioc中
      • 指定类型用Value属性,指定名称用name属性
    • @ConditionalOnProperty:判断配置文件中有对应属性和值,有才注册Bean到ioc中
      • name属性指定属性,havingValue属性指定值