Spring Boot是在Spring框架基础上构建的用于简化Java开发的框架,因其简单易用、高效快速成为企业级应用的首选。在面试中,Spring Boot相关的问题常常被问及,下面我们来介绍一些最经典的20道Spring Boot面试题,并附上详细的案例。
Spring Boot是Spring家族的一部分,用于简化Spring应用的开发、部署和管理。它通过提供开箱即用的配置,简化了Spring应用的整个开发过程。
主要优点包括:
核心注解是@SpringBootApplication
,它用于标注主程序类,表示该类是Spring Boot应用的入口。它包含了@Configuration
、@EnableAutoConfiguration
、@ComponentScan
三个注解的组合。
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Spring Boot会自动加载application.properties
或application.yml
作为默认配置文件,同时也支持通过@PropertySource
注解加载其他配置文件。
@PropertySource("classpath:custom.properties")
可以通过在@SpringBootApplication
注解的类上使用@CrossOrigin
注解,或者在Controller的方法上使用@CrossOrigin
注解来实现跨域请求。
@RestController
@CrossOrigin(origins = "http://localhost:3000")
public class MyController {
// Controller方法
}
可以使用Spring Boot DevTools实现热部署,它支持类文件和资源文件的热部署。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
可以通过@Primary
注解设置主数据源,使用@Qualifier
注解指定具体的数据源。
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
可以通过@Aspect
注解定义切面,通过@Before
、@After
等注解定义通知。
@Aspect
@Component
public class MyAspect {
@Before("execution(* com.example.demo.service.*.*(..))")
public void beforeAdvice() {
// 前置通知逻辑
}
@After("execution(* com.example.demo.service.*.*(..))")
public void afterAdvice() {
// 后置通知逻辑
}
}
Spring Boot使用@Transactional
注解来声明事务,可以在方法或类级别使用。
@Service
public class MyService {
@Transactional
public void transactionalMethod() {
// 事务性操作
}
}
可以通过@EnableCaching
注解开启缓存功能,使用@Cacheable
、@CachePut
、@CacheEvict
等注解来定义缓存操作。
@EnableCaching
public class CacheConfig {
// 配置缓存
}
@Service
public class MyService {
@Cacheable(value = "myCache", key = "#id")
public String getFromCache(String id) {
// 从缓存中获取数据
}
@CachePut(value = "myCache", key = "#id")
public String updateCache(String id) {
// 更新缓存数据
}
@CacheEvict(value = "myCache", key = "#id")
public void removeFromCache(String id) {
// 从缓存中删除数据
}
}
Profile是一种用于标识特定环境配置的机制。通过在application.properties
或application.yml
中使用spring.profiles.active
指定激活的Profile,或通过@Profile
注解在Bean上指定。
# application-dev.yml
server:
port: 8081
# application-prod.yml
server:
port: 8082
@Profile("dev")
@Bean
public MyBean devBean() {
return new MyBean("Dev Bean");
}
@Profile("prod")
@Bean
public MyBean prodBean() {
return new MyBean("Prod Bean");
}
可以使用@Async
注解标注方法,使其成为异步方法。
@Service
public class MyService {
@Async
public CompletableFuture<String> asyncMethod() {
// 异步方法逻辑
}
}
可以使用@ControllerAdvice
注解定义全局异常处理类,使用@ExceptionHandler
处理特定异常。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
// 异常处理逻辑
}
}
自动装配是Spring Boot的一项特性,通过@EnableAutoConfiguration
和@ComponentScan
自动加载符合条件的Bean。
@SpringBootApplication
public class MyApplication {
// 主程序类
}
可以使用Spring Boot集成的消息队列中间件,如ActiveMQ、RabbitMQ,通过@EnableJms
或@EnableRabbit
注解开启相应功能。
@EnableJms
public class JmsConfig {
// 配置JMS
}
@Component
public class MyJmsListener {
@JmsListener(destination = "myQueue")
public void receiveMessage(String message) {
// 消息处理逻辑
}
}
可以使用@Scheduled
注解标注方法,定时执行任务。
@Component
public class MyScheduledTask {
@Scheduled(fixedRate = 10000)
public void myTask() {
// 定时任务逻辑
}
}
可以使用@Valid
和@Validated
注解进行数据校验,结合BindingResult
获取校验结果。
@RestController
public class MyController {
@PostMapping("/validate")
public ResponseEntity<String> validate(@Valid @RequestBody MyEntity entity, BindingResult result) {
// 数据校验逻辑
}
}
可以通过引入Swagger依赖,并使用@Api
、@ApiOperation
等注解描述API接口。
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>3.0.0version>
dependency>
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo"))
.paths(PathSelectors.any())
.build();
}
}
可以使用MultipartFile
处理文件上传。
@RestController
public class FileController {
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
// 文件上传逻辑
}
}
可以使用@ServerEndpoint
注解创建WebSocket端点。
@ServerEndpoint("/websocket")
public class MyWebSocket {
@OnMessage
public void onMessage(Session session, String message) {
// WebSocket消息处理逻辑
}
}
以上只是其中的一部分问题和案例,Spring Boot作为一个强大的框架,还有很多方面值得深入学习。希望这些问题和案例能帮助你更好地理解和应用Spring Boot。
感谢阅读,如有任何问题或建议,请随时留言。