您的位置:

Spring Boot面试全攻略

一、Spring Boot简介

Spring Boot是Spring框架的后续版本,简化了Spring的配置,让使用Spring更加方便快捷。使用Spring Boot可以实现快速构建企业级应用程序,并且优化了开发体验和开发效率。Spring Boot使用了约定优于配置的方式,即默认情况下防止合理的默认配置,开发者只需要在必要时进行配置,不需要进行复杂的配置,大大提升了开发效率。

二、Spring Boot常见面试题

1. Spring Boot有哪些优点?

Spring Boot的优点主要有:

(1)简化配置:使用Spring Boot可以减少Spring框架的配置代码量,不再需要繁琐的配置XML。

(2)自动配置:Spring Boot自动根据项目的依赖关系和默认规则,自动配置Bean和环境。

(3)快速开发:Spring Boot提供诸多开箱即用的解决方案,比如模板引擎、数据访问、安全控制等,可以极大地提高开发效率。

(4)服务监测:Spring Boot可以自动监测应用程序中的服务和组件,保证应用程序的准确性和稳定性。

2. 如何在Spring Boot中使用AOP?


// 首先定义需要拦截的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}

// 定义切面
@Aspect
@Component
public class LogAspect {
    @Around("@annotation(com.example.demo.Loggable)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 记录日志
        Object result = joinPoint.proceed();
        return result;
    }
}

// 在方法上使用
@Service
public class DemoService {
    @Loggable
    public void doSomething() {
        // ...
    }
}

3. 如何集成Spring Security框架?


// 引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

// 配置安全策略
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("{noop}admin").roles("ADMIN");
    }

    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .and().httpBasic()
                .and().csrf().disable();
    }
}

// 在Controller中使用
@RestController
@RequestMapping("/admin")
public class AdminController {
    @GetMapping("/welcome")
    public String welcome() {
        return "Welcome admin!";
    }
}

三、Spring Boot常用注解

1. @SpringBootApplication

@SpringBootApplication是Spring Boot项目中最关键的注解,它相当于使用了@ComponentScan、@EnableAutoConfiguration和@SpringBootConfiguration三个注解。通常会在项目的主类中使用,如下所示:


@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

2. @RestController

@RestController是Spring MVC中的注解,表示该类中的所有方法都会自动返回JSON格式的数据。通常会在Controller中使用,如下所示:


@RestController
@RequestMapping("/demo")
public class DemoController {
    @GetMapping("/{id}")
    public DemoData getDemoData(@PathVariable Long id) {
        // ...
    }
}

3. @GetMapping

@GetMapping是Spring MVC中的注解,表示该方法处理的是HTTP GET请求。通常会在Controller中使用,如下所示:


@GetMapping("/{id}")
public DemoData getDemoData(@PathVariable Long id) {
    // ...
}

4. @PostMapping

@PostMapping是Spring MVC中的注解,表示该方法处理的是HTTP POST请求。通常会在Controller中使用,如下所示:


@PostMapping("/")
public void createDemoData(@RequestBody DemoData data) {
    // ...
}

5. @Autowired

@Autowired是Spring框架中的注解,表示自动装配Bean。通常会在Service或Controller中使用,如下所示:


@Service
public class DemoService {
    @Autowired
    private DemoRepository repository;
}

四、Spring Boot配置

1. 配置文件

Spring Boot支持多种类型的配置文件,包括.properties、.yml和.xml格式的文件。其中,.yml文件通常被认为是Spring Boot配置文件中最简洁和方便的格式。以下是一个典型的应用程序配置:


# application.yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456

2. 配置优先级

Spring Boot根据以下顺序读取配置文件,并根据优先级进行覆盖:

  • 命令行参数:使用"--property=value"格式的命令行参数覆盖配置文件中的属性。
  • Java系统属性:使用"-Dproperty=value"格式的Java系统属性覆盖配置文件中的属性。
  • 环境变量:使用"SPRING_APPLICATION_JSON"和"SPRING_CONFIG_NAME"环境变量设置属性。
  • JNDI属性:使用JNDI属性覆盖配置文件中的属性。
  • 默认属性:配置文件中指定的默认属性。

3. 自定义属性

Spring Boot支持在配置文件中自定义属性,并在代码中使用,以下是一个典型的配置:


# application.yml

my:
  property: hello

在代码中,使用@Value注解即可获取该属性的值:


@Service
public class DemoService {
    @Value("${my.property}")
    private String myProperty;
}

五、Spring Boot测试

1. 单元测试

Spring Boot使用JUnit和Spring Test框架来支持单元测试。以下是一个典型的测试类:


@SpringBootTest
public class DemoServiceTest {
    @Autowired
    private DemoService service;

    @Test
    public void testAdd() {
        // ...
    }
}

2. 集成测试

Spring Boot使用Spring Test框架来支持集成测试。以下是一个典型的测试类:


@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DemoControllerIntegrationTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @LocalServerPort
    private int port;

    @Test
    public void testGetDemoData() {
        // ...
    }
}

六、Spring Boot部署

1. WAR部署

Spring Boot可以打包成WAR文件,并部署到Jetty、Tomcat和WebLogic等Servlet容器中。以下是在Spring Boot项目中修改打包方式的方法:


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.example.demo.Application</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2. Jar部署

Spring Boot可以打包成Jar文件,并使用命令行方式运行应用程序。以下是在Spring Boot项目中修改打包方式的方法:


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.example.demo.Application</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

3. Docker部署

使用Docker可以让Spring Boot应用程序变得可移植和可伸缩。以下是一个Dockerfile文件的示例:


FROM maven:3.6.3-jdk-11 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ /app/src/
RUN mvn package

FROM adoptopenjdk/openjdk11:jre-11.0.11_9-alpine
EXPOSE 8080
COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]