一、基础概念
- 回答:Spring Boot 是一个用于构建基于 Spring 框架的独立的、生产级别的 Spring 应用程序的框架。它简化了 Spring 应用的初始搭建以及开发过程,通过提供默认配置和自动配置机制,让开发者能够快速地创建可以运行的 Spring 应用,减少了大量的样板代码。例如,在传统 Spring 应用中,需要手动配置数据源、事务管理器等众多组件,而 Spring Boot 可以根据项目中的依赖自动配置这些组件。
- 回答:
- 快速启动:通过自动配置,能够快速创建和运行 Spring 应用,大大减少了开发时间。例如,创建一个简单的 Web 应用,只需引入
spring - boot - starter - web
依赖,编写少量代码就可以启动一个 Web 服务。 - 简化配置:提供了大量的默认配置,减少了 XML 或 Java 配置文件的编写。同时支持自定义配置,通过
application.properties
或application.yml
文件可以方便地修改配置参数。 - 独立运行:Spring Boot 应用可以打包成一个包含所有依赖的可执行 JAR 文件,通过
java -jar
命令就可以直接运行,方便在不同环境中部署。 - 嵌入式服务器支持:可以方便地嵌入 Tomcat、Jetty 或 Undertow 等 Web 服务器,不需要额外安装和配置服务器环境。
- 提供各种启动器(Starters):这些启动器是一系列依赖的组合,能够快速集成各种功能,如数据库访问、消息队列、安全等,便于构建不同类型的应用。
- 回答:Spring Boot 的自动配置是基于条件注解来实现的。当应用启动时,Spring Boot 会扫描类路径下的各种依赖和配置类。例如,当发现
spring - boot - starter - data - jpa
依赖在类路径中时,它会查找相关的配置类,这些配置类中使用了条件注解(如@ConditionalOnClass
、@ConditionalOnMissingBean
等)。@ConditionalOnClass
检查特定的类是否存在于类路径中,@ConditionalOnMissingBean
检查某个特定类型的 Bean 是否已经存在。如果满足这些条件,就会自动配置相应的组件,如自动配置 JPA 相关的 EntityManagerFactory、TransactionManager 等,从而减少了手动配置的工作量。
- 回答:Spring 是一个功能强大的企业级 Java 开发框架,提供了依赖注入(DI)、面向切面编程(AOP)、数据访问(如 JdbcTemplate)等众多功能模块,但它的配置相对复杂。Spring Boot 是在 Spring 框架的基础上构建的,它的目的是简化 Spring 应用的开发和部署。Spring Boot 通过自动配置和默认配置隐藏了 Spring 框架中的许多复杂配置细节,让开发者能够更专注于业务逻辑的实现。例如,在 Spring 中配置一个数据源可能需要编写大量的 XML 或 Java 配置代码来定义数据源、连接池等,而 Spring Boot 可以根据项目中的依赖自动完成这些配置。
- 回答:Spring Boot 通过启动器(Starters)来整合 Spring 框架的各种功能。每个启动器都是一组相关依赖的集合,并且包含了自动配置类。例如,
spring - boot - starter - web
启动器包含了 Spring MVC 相关的依赖,如 Spring - web、Spring - webmvc 等,同时也包含了自动配置这些组件的类。当引入这个启动器后,Spring Boot 会根据条件自动配置 Spring MVC 相关的功能,如配置 DispatcherServlet、视图解析器等,使得开发者可以直接使用 Spring MVC 来构建 Web 应用,而不需要手动配置这些组件。
- 回答:可以通过在
application.properties
或application.yml
文件中进行配置。例如,使用 MySQL 数据库,可以配置如下(以application.properties
为例):
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver
- 回答:首先在
pom.xml
中添加spring - boot - starter - data - jpa
依赖。然后在application.properties
或application.yml
中配置数据库连接信息(如上述数据源配置)。接着,定义实体类,使用 JPA 注解(如@Entity
、@Table
、@Id
等)来映射数据库表和字段。之后,创建数据访问接口,继承JpaRepository
接口,Spring Boot 会自动为这个接口生成实现类,提供基本的 CRUD(增删改查)操作方法。例如,定义一个UserRepository
接口继承JpaRepository<User, Long>
(其中User
是实体类,Long
是实体类主键的类型),就可以直接使用这个接口来操作User
实体对应的数据库表。
- 回答:首先,在
pom.xml
中引入spring - boot - starter - web
依赖。然后创建一个控制器类,使用@RestController
注解标记这个类。在控制器类中,可以定义方法,使用@RequestMapping
或其衍生注解(如@GetMapping
、@PostMapping
等)来映射 HTTP 请求方法和路径。例如:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
}
- 回答:有多种方法可以处理跨域请求。一种简单的方法是在控制器类或者方法上使用
@CrossOrigin
注解。例如:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://localhost:8081")
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
}
- 回答:Spring Boot 提供了测试相关的支持,在
pom.xml
中需要添加spring - boot - starter - test
依赖。对于简单的单元测试,可以使用 JUnit。例如,测试一个服务层的方法:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MyServiceTest {
@Autowired
private MyService myService;
@Test
public void testMyMethod() {
// 调用服务层方法并进行断言
int result = myService.myMethod();
assert result == 1;
}
}
- 回答:同样依赖
spring - boot - starter - test
,可以使用 Spring Boot 提供的测试工具,如@WebMvcTest
用于测试 Web 层。例如:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(HelloController.class)
public class HelloControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHelloEndpoint() throws Exception {
mockMvc.percieve(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}