
文章目录概览与Spring的区别创建SpringBoot项目SpringBoot常用注解SpringBoot自动配置SpringBootConfigurationEnableAutoConfigurationSpringBoot配置管理SpringBoot嵌入式服务器SpringBoot测试概览SpringBoot是由Pivotal团队提供的全新框架其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置从而使开发人员不再需要定义样板化的配置。SpringBoot提供了一种新的编程范式可以更加快速便捷地开发Spring项目在开发过程当中可以专注于应用程序本身的功能开发而无需在Spring配置上花太大的工夫。SpringBoot基于Sring4进行设计继承了原有Spring框架的优秀基因。SpringBoot准确的说并不是一个框架而是一些类库的集合。maven或者gradle项目导入相应依赖即可使用 SpringBoot而无需自行管理这些类库的版本。特点自动配置SpringBoot提供自动配置功能根据项目的依赖和环境自动设置 Spring应用程序减少了手动配置的复杂度。启动器SpringBoot提供“启动器”依赖集合如spring-boot-starter-web简化了项目的依赖管理。嵌入式服务器SpringBoot支持嵌入式服务器如Tomcat、Jetty和Undertow使得应用程序可以独立运行无需外部Web服务器。生产级别的特性SpringBoot具备生产级别的功能包括健康检查、应用监控、日志管理等。Actuator 模块可以轻松监控和管理应用程序。无配置的约定SpringBoot遵循“无配置”的原则使用合理的默认值和约定减少需要编写的配置代码。快速开发SpringBoot的项目结构和默认配置帮助开发者快速启动新项目。内置工具和插件支持开发、测试和部署。与Spring的区别Spring提供了大量的子模块如Spring Core、Spring Web、Spring Data等但它们的配置复杂度较高且需要开发者手动配置各类文件和依赖。SpringBoot基于Spring目的是简化Spring应用的创建和配置。SpringBoot是对Spring的扩展简化了Spring应用开发的过程但仍然依赖Spring核心库。使用SpringBoot开发的应用实际上是基于Spring的只是通过自动配置和内置依赖提升了开发效率。Spring和SpringBoot的主要区别在于配置和启动的复杂性。Spring框架需要大量的手动配置包括XML配置文件或Java配置类配置过程较为繁琐且易出错。此外Spring应用程序通常需要部署到外部的Web服务器并需要额外的步骤来启动和运行。相比之下SpringBoot提供了自动配置功能可以根据项目的依赖自动设置应用程序极大地简化了配置工作。它还支持嵌入式服务器使得应用程序能够独立运行无需外部 Web 服务器且可以通过java -jar命令直接启动。这些特点使得SpringBoot更加适合快速开发和部署应用程序。创建SpringBoot项目在IDEA中使用Spring Initializr快速创建一个SpringBoot项目。选择所需的依赖SpringBoot项目通常包括以下几个主要部分在src/main/resources目录下创建application.properties或application.yml文件来配置应用程序。示例配置如下主应用类通常位于项目的根包并使用SpringBootApplication注解。创建一个Controller处理HTTP请求并返回响应。使用RestController注解定义控制器使用RequestMapping或GetMapping处理请求。在IDE中运行右击主应用类并选择“Run”。通过浏览器输入http://localhost:8081/api/hello测试。SpringBoot常用注解在SpringBoot开发中常用的注解简化了配置和开发流程。SpringBootApplication标注在启动类上它综合了Configuration、EnableAutoConfiguration和ComponentScan注解用于自动配置和组件扫描。SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }RestController是一个组合注解结合了Controller和ResponseBody。用于定义控制器类并将返回的对象自动转换为JSON或XML格式简化了RESTful API的开发。RestController RequestMapping(/api) public class MyController { GetMapping(/hello) public String sayHello() { return Hello, World!; } }Controller用于定义一个SpringMVC 控制器类它的主要目的是处理Web请求并返回视图如JSP、Thymeleaf模板等。Controller public class MyController { GetMapping(/home) public String home() { return home; // 返回视图名例如 home.html } }RequestMapping映射HTTP请求到控制器的方法。支持不同的请求方法GET、POST等其衍生注解为GetMapping、PostMapping、PutMapping、DeleteMapping。RestController public class MyController { RequestMapping(value /hello, method RequestMethod.GET) public String getHello() { return Hello, GET!; } }RequestBody将HTTP请求体的内容绑定到方法参数上。通常用于POST请求当请求的内容是JSON、XML或其他类型的数据时可以通过RequestBody注解将其自动转换为Java对象。RestController public class MyRestController { PostMapping(/submit) public String submitData(RequestBody MyRequestData data) { // 处理数据 return Data received: data.toString(); } } class MyRequestData { private String name; private int age; }ResponseBody将方法的返回值直接写入HTTP响应体中。常用于控制器方法以使得返回的数据通常是JSON或XML能够被自动序列化并发送给客户端。Controller ResponseBody RequestMapping(/api) public class MyRestController { GetMapping(/info) public MyResponseData getInfo() { return new MyResponseData(Alice, 30); } } class MyResponseData { private String name; private int age; public MyResponseData(String name, int age) { this.name name; this.age age; } }Autowired自动注入Spring管理的Bean。可以用于构造函数、字段或setter方法。Service public class MyService { private final MyRepository myRepository; Autowired public MyService(MyRepository myRepository) { this.myRepository myRepository; } }Component标记Spring组件使其能够被自动扫描和管理Component为标记通用的Spring组件。Service public class MyService { private final MyRepository myRepository; Autowired public MyService(MyRepository myRepository) { this.myRepository myRepository; } }Service标记Spring业务组件用于业务逻辑处理。Service public class MyService { // 业务逻辑 }Repository标记Spring数据访问组件用于数据持久化。Repository public class MyRepository { // 数据访问逻辑 }Configuration标记Spring配置类用于配置Spring容器、配置Bean。Configuration public class AppConfig { Bean public MyBean myBean() { return new MyBean(); } }Bean在配置类中定义Bean方法Spring管理这些Bean的生命周期。Bean public MyBean myBean() { return new MyBean(); }Value从配置文件中注入值到字段允许应用程序灵活地读取外部配置。Component public class MyComponent { Value(${my.property}) private String myProperty; }ConfigurationProperties用于将配置文件中的属性映射到Java类中。这样配置可以作为一个JavaBean进行管理便于在应用中使用。ConfigurationProperties(prefix myapp) public class MyAppProperties { private String name; private int maxAttempts; // getters and setters } myapp.nameMyApplication myapp.maxAttempts5Conditional用于根据条件判断是否应用特定的配置。Conditional注解的核心是通过Condition接口的实现来控制Bean的创建。Spring在启动时会检查这些条件只有当所有条件都满足时相关的Bean才会被注册到Spring容器中。public class CustomCondition implements Condition { Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 自定义条件逻辑 String property context.getEnvironment().getProperty(custom.property); return expectedValue.equals(property); } }SpringBoot自动配置SpringBoot的自动配置通过条件化配置和扫描机制来简化应用设置。应用启动时SpringBoot根据spring.factories文件中的配置自动加载所有标记为自动配置的类。每个自动配置类使用条件注解如ConditionalOnClass、ConditionalOnMissingBean等来判断是否应该应用特定的配置。这些注解帮助决定是否创建和配置Bean。如果符合条件SpringBoot会自动生成所需的Bean实例并将其添加到应用上下文中。其自动配置原理是通过SpringBootApplication注解在启动时加载的。SpringBootApplication这个注解通常标注在启动类上SpringBootApplication public class SpringBootExampleApplication { public static void main(String[] args) { SpringApplication.run(SpringBootExampleApplication.class, args); } }SpringBootApplication是一个复合注解即由其他注解构成。核心注解是SpringBootConfiguration和EnableAutoConfiguration。Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inherited SpringBootConfiguration EnableAutoConfiguration ComponentScan(excludeFilters { Filter(type FilterType.CUSTOM, classes TypeExcludeFilter.class), Filter(type FilterType.CUSTOM, classes AutoConfigurationExcludeFilter.class) }) public interface SpringBootApplication {}SpringBootConfigurationSpringBootConfiguration核心注解是Configuration的作用是将类标记为配置类可以定义Bean方法来创建和配置 Spring容器中的Bean。Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Configuration public interface SpringBootConfiguration {}Configuration底层实现就是一个Component。/** * Indicates that an annotated class is a component. * Such classes are considered as candidates for auto-detection * when using annotation-based configuration and classpath scanning. * */ Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Indexed public interface Component{}EnableAutoConfigurationEnableAutoConfiguration作用是启用SpringBoot的自动配置机制。它的核心是AutoConfigurationPackage和Import({AutoConfigurationImportSelector.class})Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Inherited AutoConfigurationPackage Import({AutoConfigurationImportSelector.class}) public interface EnableAutoConfiguration {}AutoConfigurationPackage的核心是引入了一个Import(AutoConfigurationPackages.Registrar.class)配置类该类实现了ImportBeanDefinitionRegistrar接口。这个注解本身的含义就是将主配置类SpringBootApplication标注的类所在的包下面所有的组件都扫描到Spring容器中。/** * {link ImportBeanDefinitionRegistrar} to store the base package from the importing * configuration. */ static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports { Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0])); } Override public SetObject determineImports(AnnotationMetadata metadata) { return Collections.singleton(new PackageImports(metadata)); } }AutoConfigurationImportSelector类的作用是通过扫描spring.factories文件加载所有自动配置类。/** * Return the auto-configuration class names that should be considered. By default * this method will load candidates using {link SpringFactoriesLoader} with * {link #getSpringFactoriesLoaderFactoryClass()}. * param metadata the source metadata * param attributes the {link #getAttributes(AnnotationMetadata) annotation * attributes} * return a list of candidate configurations */ protected ListString getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { ListString configurations SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); Assert.notEmpty(configurations, No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.); return configurations; }但是spring.factories包含了很多类并不是全部都加载的在某些类里面是有一个条件ConditionalOnXXX注解只有当这个注解上的条件满足才会加载。如SpringApplicationAdminJmxAutoConfiguration。Configuration(proxyBeanMethods false) AutoConfigureAfter(JmxAutoConfiguration.class) ConditionalOnProperty(prefix spring.application.admin, value enabled, havingValue true,matchIfMissing false) public class SpringApplicationAdminJmxAutoConfiguration {}当一个类使用SpringBootApplication注解时SpringBoot会自动进行一系列配置让应用快速启动并运行。这个注解包含了SpringBootConfiguration相当于告诉 Spring这是一个配置类就像使用了Configuration一样。Configuration的作用是将类标记为配置类这个配置类可以定义Bean方法来创建和配置 Spring容器中的Bean。同时EnableAutoConfiguration启用了SpringBoot的自动配置功能SpringBoot会根据项目中的依赖自动配置很多常用的 Spring组件这样就不需要手动配置它们。这个自动配置的过程是通过扫描spring.factories文件中的自动配置类来实现的。另外ComponentScan让 Spring自动扫描当前包及其子包下的所有组件比如标注了Component、Service、Repository和Controller的类并把它们注册到Spring容器中。因此把应用的主类放在根包中SpringBoot就会自动扫描并加载所有需要的组件和配置让你可以专注于编写业务代码而不用担心复杂的配置细节。SpringBoot通过这一系列自动化的配置和扫描机制简化了开发和配置的工作量让应用能够快速启动并运行。SpringBoot配置管理SpringBoot支持application.properties和application.yml两种格式的配置文件通常放置在src/main/resources目录下。server: port: 8080 spring: # 数据源配置 datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: secret # 自定义属性 myapp: name: MyApplication maxAttempts: 5如果想要读取配置可以使用Value注解或者ConfigurationProperties注解。使用ConfigurationProperties注解将配置文件中的属性绑定到Java类中能够将复杂配置集中管理。ConfigurationProperties(prefix myapp) public class MyAppProperties { private String name; private int maxAttempts; // getters and setters }使用Value注解可以将配置文件中的单个属性注入到Bean的字段中。Component public class MyComponent { Value(${myapp.name}) private String appName; }但需要注意的是并不是在配置文件中配置了就一定会加载SpringBoot配置的加载优先级由高到低依为命令行参数命令行参数的配置优先级最高。当你启动SpringBoot应用时可以通过命令行传递配置参数这些参数会覆盖其他来源的配置。java -jar myapp.jar -Dserver.port9090环境变量环境变量的配置优先级低于命令行参数但高于application.properties和application.yml文件。环境变量通常用于在操作系统级别定义配置例如在生产环境中。export SERVER_PORT9090application.properties或application.yml文件这些文件通常位于src/main/resources目录下提供了默认的配置。这些配置会被加载到应用程序上下文中但它们的优先级低于命令行参数。server.port8080系统属性系统属性通过System.setProperty方法设置优先级最低。这些属性可以在应用启动时或者在JVM启动时通过-D参数设置虽然优先级低于其他配置源但它们仍然会被加载。System.setProperty(server.port, 9090);除此之外可以使用application-{profile}.properties或application-{profile}.yml文件为不同的环境提供特定的配置。且通过设置spring.profiles.active属性来激活特定的环境配置。server.port8081 # application.properties spring.profiles.activedev有时需要根据特定条件加载不同的配置文件。这种需求通常出现在环境配置、特性开关或者动态调整配置的场景中就可以通过环境控制的方式来实现。application-dev.propertiesserver.port8081 myapp.featureenabledapplication-prod.propertiesserver.port80 myapp.featuredisabled在application.properties中激活特定的profilespring.profiles.activedev这样SpringBoot会根据激活的profile加载对应的配置文件。其实使用Profile注解也能实现环境控制Profile注解允许在特定的profile激活时创建Bean或配置类。结合Configuration使用可以在不同的环境中加载不同的Bean配置。Configuration Profile(dev) public class DevConfiguration { Bean public MyBean myBean() { return new MyBean(Development Bean); } }或者使用ConditionalConditional注解允许根据条件决定是否加载配置。可以结合自定义条件来实现复杂的条件加载逻辑。public class OnCustomCondition implements Condition { Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 逻辑判断 return true.equals(System.getProperty(custom.condition)); } } Configuration Conditional(OnCustomCondition.class) public class CustomConditionConfiguration { Bean public CustomBean customBean() { return new CustomBean(); } }SpringBoot嵌入式服务器SpringBoot提供了内置的Web服务器如Tomcat、Jetty和Undertow嵌入式的服务器功能使得构建和运行JavaWeb应用变得更加简单。有了嵌入式的服务器就不需要将应用程序打包为WAR包并部署到外部服务器直接打包为JAR文件即可运行。而且运行和调试Web应用时不需要管理服务器的独立生命周期而且内置服务器通常比外部服务器占用的资源少启动速度更快。SpringBoot默认内置Tomcat作为嵌入式服务器。如果没有特别修改应用将使用Tomcat。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency如果要使用Jetty代替Tomcat需要在pom.xml中排除Tomcat并添加Jetty依赖。dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jetty/artifactId /dependency /dependencies内置的服务器实际上SpringBoot是通过自动配置机制来简化Web服务器的配置。应用启动时SpringBoot会自动检测类路径中的依赖并根据它们自动配置Web服务器。自动配置类位于org.springframework.boot.autoconfigure.web.servlet包中例如TomcatServletWebServerFactory、JettyServletWebServerFactory和UndertowServletWebServerFactory。Configuration ConditionalOnClass(Servlet.class) ConditionalOnMissingBean(ServletWebServerFactory.class) EnableConfigurationProperties(WebServerProperties.class) public class TomcatServletWebServerFactoryConfiguration { Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory(WebServerProperties properties) { TomcatServletWebServerFactory factory new TomcatServletWebServerFactory(); // 配置 Tomcat 服务器 return factory; } }SpringBoot使用ServletWebServerFactory接口及其实现例如TomcatServletWebServerFactory来创建内嵌的Web服务器。ServletWebServerFactory提供了创建和配置Web服务器的能力。当应用启动时SpringBoot会创建一个ServletWebServerFactory实现的实例并使用该实例启动Web服务器。Bean public ServletWebServerFactory servletContainer() { TomcatServletWebServerFactory factory new TomcatServletWebServerFactory(); factory.setPort(8080); return factory; }可以通过实现TomcatServletWebServerFactory、JettyServletWebServerFactory或UndertowServletWebServerFactory接口来自定义嵌入式服务器的配置。Configuration public class CustomTomcatFactory extends TomcatServletWebServerFactory { Bean Override public ServletWebServerFactory servletContainer() { return new TomcatServletWebServerFactory() { Override protected Tomcat getTomcatEmbeddedServletContainer() { Tomcat tomcat super.getTomcatEmbeddedServletContainer(); // 自定义 Tomcat 配置 tomcat.getConnector().setAttribute(maxThreads, 200); // 可以在这里添加更多自定义逻辑 return tomcat; } }; } }SpringBoot测试测试是保证应用正确性和稳定性的关键部分SpringBoot提供了多种测试工具和注解以便于进行集成测试、单元测试和功能测试。创建一个单元测试步骤导入测试依赖。org.springframework.boot spring-boot-starter-test test org.junit.jupiter junit-jupiter-api test org.junit.jupiter junit-jupiter-engine test编写测试类。通常测试类放在与主代码相同的包结构中的src/test/java目录下。SpringBootTest// RunWith(xxxx.class)public class MyServiceTests {Autowired private MyService myService; Test public void testPerformAction() { String result myService.performAction(); assertEquals(ExpectedResult, result); }}一个最简单的单元测试就创建完毕了。在实际测试中有时候需要测试场景中加载配置TestConfiguration注解用于创建专门的测试配置类。这些配置类仅在测试上下文中有效用于提供测试所需的额外Bean。TestConfiguration public class TestConfig { Bean public TestService testService() { return new TestService(); } }然后在测试类中引入该配置SpringBootTest Import(TestConfig.class) public class ServiceTests { Autowired private TestService testService; Test public void testService() { // 测试逻辑 } }除了这些还能使用ExtendWith和自定义扩展自定义扩展来添加额外的功能如测试环境准备、清理操作等。public class CustomExtension implements TestInstancePostProcessor, TestExecutionExceptionHandler { Override public void postProcessTestInstance(Object testInstance, ExtensionContext context) { // Custom initialization } Override public void handleTestExecutionException(ExtensionContext context, Throwable throwable) throws Throwable { // Custom exception handling } }在测试类中引入该扩展ExtendWith(CustomExtension.class) public class CustomExtensionTests { Test public void testWithCustomExtension() { // Test logic } }