您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。