一、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"]