2021最新版Spring Boot的面试题有哪些

发布时间:2021-10-13 14:21:21 作者:iii
来源:亿速云 阅读:156
# 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); // 内嵌服务器启动
    }
}

1.2 Spring Boot Starter的作用

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.3 自动配置原理

核心流程: 1. 启动时加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2. 通过@Conditional系列注解条件化加载配置 3. 通过@EnableConfigurationProperties绑定配置

@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    // 自动配置逻辑
}

二、核心机制面试题(约1200字)

2.1 Spring Boot启动过程

启动阶段关键节点: 1. 创建SpringApplication实例 - 推断应用类型(Web/Reactive) - 加载ApplicationContextInitializer - 加载ApplicationListener 2. 执行run()方法

   public ConfigurableApplicationContext run(String... args) {
       // 1. 启动计时器
       // 2. 准备Environment
       // 3. 打印Banner
       // 4. 创建ApplicationContext
       // 5. 准备上下文
       // 6. 刷新上下文
       // 7. 执行Runner接口
   }

2.2 外部化配置加载顺序

配置源优先级(从高到低): 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

2.3 健康检查机制

内置健康指示器: - DataSourceHealthIndicator:数据库连接检查 - DiskSpaceHealthIndicator:磁盘空间检查 - RedisHealthIndicator:Redis连接检查

自定义健康检查:

@Component
public class CustomHealthIndicator 
    implements HealthIndicator {
    
    @Override
    public Health health() {
        return Health.up()
            .withDetail("version", "1.0")
            .build();
    }
}

三、数据访问相关(约1500字)

3.1 JPA与MyBatis整合

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 { ... }

3.2 多数据源配置

配置类示例:

@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();
    }
}

3.3 事务管理

声明式事务示例:

@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)

四、高级特性(约2000字)

4.1 自定义Starter开发

完整开发流程: 1. 创建autoconfigure模块 2. 编写业务功能类

   public class MyService {
       private String prefix;
       private String suffix;
       
       // getters & setters
       
       public String wrap(String content) {
           return prefix + content + suffix;
       }
   }
  1. 编写自动配置类

    @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;
       }
    }
    

4.2 监控端点扩展

自定义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();
    }
}

五、性能优化(约800字)

5.1 启动速度优化

常用优化手段: 1. 延迟初始化

   spring:
     main:
       lazy-initialization: true
  1. 排除自动配置
    
    @SpringBootApplication(exclude = {
       DataSourceAutoConfiguration.class,
       KafkaAutoConfiguration.class
    })
    
  2. 使用AOT优化(Spring Native)

5.2 内存优化方案

  1. 限制Tomcat线程数
    
    server:
     tomcat:
       max-threads: 50
       accept-count: 10
    
  2. 调整JVM参数
    
    -Xms256m -Xmx512m -XX:MaxMetaspaceSize=128m
    
  3. 使用@Scope("prototype")减少单例Bean内存占用

六、云原生支持(约600字)

6.1 Docker集成

典型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

6.2 Kubernetes部署

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"

七、高频实战问题(约800字)

7.1 跨域解决方案

方案一:全局配置

@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 {
    // ...
}

7.2 文件上传异常处理

常见问题处理: 1. 文件大小限制

   spring:
     servlet:
       multipart:
         max-file-size: 10MB
         max-request-size: 20MB
  1. 临时目录权限
    
    @Bean
    public MultipartConfigElement multipartConfigElement() {
       MultipartConfigFactory factory = new MultipartConfigFactory();
       factory.setLocation("/tmp/uploads");
       return factory.createMultipartConfig();
    }
    

八、最新特性(Spring Boot 2.5+)(约500字)

8.1 新版本特性

  1. 增强的指标监控(Micrometer 1.7+)
  2. 改进的Docker镜像构建(Buildpack升级)
  3. 环境变量前缀支持
    
    spring:
     config:
       import: "configtree:/etc/config/"
    
  4. 响应式事务支持(R2DBC)

8.2 迁移注意事项

从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格式编写,可根据需要调整内容深度或补充具体案例。

推荐阅读:
  1. 分享有关spring boot面试题及答案
  2. 2021有哪些最新版的Dubbo面试题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java spring boot

上一篇:如何读取mysql binlog开始和结束时间

下一篇:如何高效编写网页代码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》