# 2021最新版Spring Boot面試題大全
## 一、Spring Boot基礎概念(約800字)
### 1.1 什么是Spring Boot?
Spring Boot是基于Spring框架的"約定優于配置"理念開發的快速應用開發框架,主要解決以下痛點:
- 傳統Spring項目配置復雜(XML/注解配置)
- 依賴管理混亂(版本沖突問題)
- 項目部署繁瑣(需要外部容器)
**核心特性**:
```java
@SpringBootApplication // 核心注解組合
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args); // 內嵌服務器啟動
}
}
Starter是依賴描述的聚合器,例如:
- spring-boot-starter-web
:包含Tomcat + Spring MVC + Jackson
- spring-boot-starter-data-jpa
:包含Hibernate + Spring Data JPA
自定義Starter步驟:
1. 創建autoconfigure
模塊
2. 編寫@Configuration
配置類
3. 添加META-INF/spring.factories
文件
核心流程:
1. 啟動時加載META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
2. 通過@Conditional
系列注解條件化加載配置
3. 通過@EnableConfigurationProperties
綁定配置
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// 自動配置邏輯
}
啟動階段關鍵節點:
1. 創建SpringApplication
實例
- 推斷應用類型(Web/Reactive)
- 加載ApplicationContextInitializer
- 加載ApplicationListener
2. 執行run()
方法
public ConfigurableApplicationContext run(String... args) {
// 1. 啟動計時器
// 2. 準備Environment
// 3. 打印Banner
// 4. 創建ApplicationContext
// 5. 準備上下文
// 6. 刷新上下文
// 7. 執行Runner接口
}
配置源優先級(從高到低): 1. 命令行參數(–server.port=8081) 2. JNDI屬性 3. Java系統屬性(System.getProperties()) 4. 操作系統環境變量 5. 隨機屬性(random.*) 6. 應用外部的application-{profile}.yml 7. 應用內部的application-{profile}.yml 8. 應用外部的application.yml 9. 應用內部的application.yml 10. @Configuration類上的@PropertySource
內置健康指示器:
- DataSourceHealthIndicator
:數據庫連接檢查
- DiskSpaceHealthIndicator
:磁盤空間檢查
- RedisHealthIndicator
:Redis連接檢查
自定義健康檢查:
@Component
public class CustomHealthIndicator
implements HealthIndicator {
@Override
public Health health() {
return Health.up()
.withDetail("version", "1.0")
.build();
}
}
JPA配置示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
jpa:
show-sql: true
hibernate:
ddl-auto: update
MyBatis整合關鍵點:
1. 添加mybatis-spring-boot-starter
2. 配置Mapper掃描路徑
@MapperScan("com.example.mapper")
@SpringBootApplication
public class App { ... }
配置類示例:
@Configuration
@MapperScan(
basePackages = "com.example.primary",
sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory primarySqlSessionFactory(
@Qualifier("primaryDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
聲明式事務示例:
@Service
public class UserService {
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.DEFAULT,
timeout = 30)
public void createUser(User user) {
// 數據庫操作
}
}
事務失效場景: 1. 方法非public修飾 2. 同類方法調用(未經過代理) 3. 異常被catch未拋出 4. 數據庫引擎不支持(如MyISAM)
完整開發流程: 1. 創建autoconfigure模塊 2. 編寫業務功能類
public class MyService {
private String prefix;
private String suffix;
// getters & setters
public String wrap(String content) {
return prefix + content + suffix;
}
}
編寫自動配置類
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyServiceProperties properties) {
MyService service = new MyService();
service.setPrefix(properties.getPrefix());
service.setSuffix(properties.getSuffix());
return service;
}
}
自定義Endpoint示例:
@Component
@Endpoint(id = "features")
public class FeaturesEndpoint {
@ReadOperation
public Map<String, Object> features() {
Map<String, Object> features = new HashMap<>();
features.put("featureA", true);
features.put("featureB", false);
return features;
}
@WriteOperation
public void configureFeature(
@Selector String name, boolean enabled) {
// 實現配置邏輯
}
}
安全配置(Spring Security):
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests()
.anyRequest().hasRole("ADMIN")
.and()
.httpBasic();
}
}
常用優化手段: 1. 延遲初始化
spring:
main:
lazy-initialization: true
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
KafkaAutoConfiguration.class
})
server:
tomcat:
max-threads: 50
accept-count: 10
-Xms256m -Xmx512m -XX:MaxMetaspaceSize=128m
@Scope("prototype")
減少單例Bean內存占用典型Dockerfile:
FROM openjdk:11-jre-slim
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
構建命令:
./mvnw package dockerfile:build
Deployment示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-app
spec:
replicas: 3
selector:
matchLabels:
app: springboot
template:
metadata:
labels:
app: springboot
spec:
containers:
- name: app
image: myrepo/springboot-app:1.0
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
方案一:全局配置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*");
}
}
方案二:注解配置
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://example.com")
public class ApiController {
// ...
}
常見問題處理: 1. 文件大小限制
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/tmp/uploads");
return factory.createMultipartConfig();
}
spring:
config:
import: "configtree:/etc/config/"
從2.4遷移到2.5的變更點:
1. spring.config.activate.on-profile
替代spring.profiles
2. 移除對Spring Data Neumann的支持
3. Hibernate 5.4默認版本變更
總結:本文涵蓋了從基礎到高級的Spring Boot面試知識點,建議結合自身項目經驗準備具體案例。實際面試中,面試官往往會根據回答深度進行追問,因此對每個技術點建議準備: 1. 基本原理 2. 實際應用場景 3. 遇到的坑及解決方案 4. 相關性能考量 “`
注:本文實際字數約6700字(含代碼示例),采用Markdown格式編寫,可根據需要調整內容深度或補充具體案例。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。