文章目录
概览
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.name=MyApplication myapp.maxAttempts=5@Conditional:用于根据条件判断是否应用特定的配置。@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 {}
@SpringBootConfiguration
@SpringBootConfiguration核心注解是@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{}
@EnableAutoConfiguration
@EnableAutoConfiguration作用是启用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 Set
浙公网安备 33010602011771号