SpeingBoot在spring的基础上极大的简化了编写过程,下面详细介绍其一些高级特性,重要特性有自动配置,外部化配置,嵌入式容器支持,
自动配置
SpringBoot的自动配置根据添加到项目里的jar依赖包自动配置Spring应用,如:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.1.0</version> </dependency> //自动配置Tomcat和SpringMVC,提供@EnableAutoConfiguration和SPringBootApplication注解
SpringBoot的自动配置是其核心特性之一,遵循约定大于配置的原则。在boot程序启动后,一些bean对象自动注入到IOC容器,不需要手动声明,简易开发。
注解使用:
-
@EnableAutoConfiguration:告诉SpringBoot开始根据classpath中的jar包,beans等各种配置进行自动配置。
-
@SpringBootApplication:包含了@EnableAutoConfiguration,等同于使用了@Configuration,@ComponentScan和@EnableAutoConfiguration,标记在主类上,开启组件扫描自动配置功能
自定义和控制
尽管自动配置极大简化配置工作,但在需要覆盖默认的配置或添加额外的配置,SpringBoot提供多种方法自定义和控制控制配置
排除特定自动配置类:@SpringBootApplication或@EnableAutoConfiguration注解的exclude属性排除,如:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
//...
}
使用properties文件覆盖原有配置定义
自定义配置类:创建自己的@Configuration类,如果你定义了一个自己的DataSourceBean,SpringBoot将不会自动配置DataSource了。
条件注解:
SpringBoot使用条件注解来决定某个配置是否应该生效,这允许应用在不同环境下灵活加载不同配置
注解用途及说明:
-
@ConditionalOnClass 和 @ConditionalOnMissingClass @ConditionalOnClass:这个注解用于条件化地配置某个bean,只有当指定的类路径上有特定的类时,相应的配置才会被注册。这对于仅当特定功能或库可用时才激活某些配置非常有用。
@ConditionalOnMissingClass:与@ConditionalOnClass相反,这个注解确保只有当类路径上缺少指定的类时,才会注册相应的配置。这可以用于提供后备配置或默认行为。
-
@ConditionalOnBean 和 @ConditionalOnMissingBean @ConditionalOnBean:这个注解允许根据Spring上下文中是否存在某个或某些bean来条件化地注册配置。例如,只有当特定类型的bean已经被创建和注册时,某个配置或bean才会被激活。
@ConditionalOnMissingBean:与@ConditionalOnBean相反,这个注解确保只有在Spring上下文中缺少特定类型或名称的bean时,才会注册相应的配置。这在定义默认配置时特别有用。
-
@ConditionalOnProperty 这个注解允许基于Spring环境中的属性值来条件化配置。它可以检查一个属性是否存在,或者检查一个属性的值是否有特定的值。这使得基于不同的配置文件或环境变量来激活或禁用特定功能成为可能。
-
@ConditionalOnResource 这个注解允许基于类路径上是否存在特定资源来条件化配置。如果指定的资源存在,那么相关的配置就会被注册。这对于只有在特定资源可用时才需要的配置很有用。
-
@ConditionalOnExpression 这个注解允许基于SpEL(Spring Expression Language)表达式的评估结果来条件化配置。这提供了一种非常灵活的方式来控制配置的注册,可以基于几乎任何可以通过表达式评估的逻辑条件。
-
@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication @ConditionalOnWebApplication:这个注解确保只有在当前应用是一个Web应用时,相应的配置才会被激活。这对于仅适用于Web环境的配置特别有用。
@ConditionalOnNotWebApplication:与@ConditionalOnWebApplication相反,这个注解确保只有在当前应用不是Web应用时,相应的配置才会被注册。
这些条件注解使得Spring Boot应用能够在不同环境下灵活地加载配置,实现了真正的“按需配置”。开发者可以通过组合使用这些注解,根据实际运行环境的不同情况,来优雅地管理和调整应用的行为和配置,无需改变代码就可以适应不同的部署环境。
原文链接:Spring Boot 一些常用的高级特性_springboot 高级特性-CSDN博客 //大佬!
外部化配置:
SpringBoot允许使用属性文件,环境变量和命令行参数来外部化配置,在项目外进行配置修改,及应用配置与代码分离。即使已经进行Tomcat打包部署,修改外部配置后无需再次允许打包部署,根据修改后的环境动态调整项目的行为进行运行。
属性文件:
application.properties:SpringBoot默认的配置文件
环境特定的配置文件 Spring Boot 允许你为不同的环境提供不同的配置文件,如application-dev.properties或application-test.yml等。你可以通过设置spring.profiles.active属性来激活特定的配置文件。这个属性可以在应用运行时通过多种方式设置,如环境变量、JVM系统属性等。
命令行参数 Spring Boot 允许你通过命令行参数来覆盖配置文件中的任何属性。例如,你可以在运行Jar文件时通过--来指定参数,如java -jar app.jar --server.port=8081将应用的端口改为8081。
环境变量 环境变量也可以用来覆盖应用的配置。Spring Boot遵循一定的属性名转换规则,使得环境变量能够覆盖对应的属性值。例如,SERVER_PORT环境变量将覆盖server.port属性。
属性占位符 Spring Boot 的配置文件支持属性占位符,这意味着你可以在一个属性的值中引用另一个属性的值。例如,如果你已经定义了一个属性name=Spring,你可以在同一配置文件中通过${name}来引用这个值。
配置属性绑定 Spring Boot 允许将配置文件中的属性绑定到Java对象上。你可以通过@ConfigurationProperties注解将配置文件中的属性映射到具有相同属性名的POJO(Plain Old Java Object)上,这样就可以在代码中以类型安全的方式访问这些属性。
配置优先级 Spring Boot 在处理外部化配置时遵循特定的优先级顺序。这意味着,当多个配置源定义了相同的属性时,某些配置源会覆盖其他的。一般来说,命令行参数的优先级最高,其次是系统属性、环境变量和配置文件。
通过上述机制,Spring Boot 的外部化配置为应用提供了极大的灵活性和可扩展性,使得相同的代码基础可以轻松适应不同的环境和需求。
配置文件:
通过配置文件Profiles,可以为不同的环境提供不同的配置,如开发,测试和生产环境。application.properties或application.yml文件中设置spring.profiles.active来激活特定的Profile。
配置文件 Profiles 是 Spring Boot 提供的一个功能,允许开发者为不同的环境定义不同的配置。这种方式非常适合在多环境(如开发、测试、生产环境)下工作时使用,因为它可以帮助你管理每个环境特有的配置,而无需改变代码。
嵌入式容器支持:
SpringBoot提供了嵌入式Tomcat,jetty或Undertow服务器的支持,意味着不需要部署war文件。过去,传统的Javaweb项目通常先打包成war文件并部署到外部的Servlet容器(如Tomcat)。
与之相反,SpringBoot允许直接将应用打包成可执行的jar包,包内内置Servlet容器
(梳理一下jar包和war包的区别:jar包是类的归档文件,将类与相关资源封装到压缩的归档文件,war包是web应用程序,是可以直接运行的web模块)
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.1</version> //随意 </dependency>
优点:
-
简化部署:应用可以被打包成一个单一的 JAR 文件,包含所有必需的依赖、资源和嵌入式容器。这简化了部署过程,因为你只需要运行这个 JAR 文件即可。
-
便于开发和测试:开发者可以直接从 IDE 或命令行运行和测试应用,无需部署到外部容器。
-
环境一致性:由于应用和容器被打包在一起,开发、测试和生产环境之间的差异减少,减少了环境配置差异带来的问题。
SpringBoot还拥有许多特性,如监控管理Actuator(),日志配置,开发者工具,测试支持等,就不一一赘述。