今天咱们聊聊Spring Boot里面那些让人“恨不得立刻记住”的注解。说实话,每次面试都绕不开Spring Boot的注解相关问题,尤其是配置类、主类这些核心点,弄不好直接变成面试“滑铁卢”。
那么话不多说,我来细细捋一捋这些注解背后的知识点,还给大家来点代码举例和面试场景模拟。
先从最熟悉的@@SpringBootApplication说起吧。
这个注解几乎是Spring Boot应用的开门砖。它同时包含了以下三个注解的功能:
- @SpringBootConfiguration:标识当前类是配置类,相当于传统Spring中的@Configuration。
- @EnableAutoConfiguration:开启Spring Boot的自动配置功能。
- @ComponentScan:让Spring Boot扫描标注了@Component、@Service、@Repository、@Controller等注解的类,把它们注册到Spring容器中。
用法很简单,一般直接加在主类上:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
注意,主类一般放在项目根包下,这样@ComponentScan就能自动扫描子包里的所有组件。如果有自定义扫描路径需求,可以直接指定:
@SpringBootApplication(scanBasePackages = "com.example.custom")
再来说说Spring中常见的几个核心注解:@Controller、@RestController、@Service、@Repository、@Component
这些注解的作用很好理解,归根结底就是为了解决分层的问题。
@Controller这是MVC架构中控制器的标志,用来处理用户的HTTP请求。通常返回的是视图页面的名称。
@Controller
public class HomeController {
@RequestMapping("/home")
public String home() {
return "home"; // 返回的是视图的名字,比如 home.html
}
}
@RestController这个是@Controller和@ResponseBody的结合体,直接返回数据而不是视图。
@RestController
public class ApiController {
@GetMapping("/api/data")
public String getData() {
return "Hello, World!"; // 直接返回JSON格式的数据
}
}
@Service用于标识服务层,主要承载业务逻辑,没啥特殊功能,但能让代码更清晰。
@Service
public class UserService {
public String getUserById(Long id) {
return "User_" + id;
}
}
@Repository专为数据访问层设计,主要是标记数据库操作的类,Spring会为它生成代理类,处理异常。
@Repository
public class UserRepository {
public List<String> findAllUsers() {
return List.of("User1", "User2", "User3");
}
}
@Component是个通用型的注解,所有受Spring管理的类都能用它来标记。但为了分层清晰,尽量用上面具体的注解。
@Component
public class GenericComponent {
public void doSomething() {
System.out.println("Doing something...");
}
}
自动装配的神器:@Autowired
当某个类需要使用Spring容器里的Bean时,用@Autowired可以直接注入。它支持字段注入、构造方法注入和Setter注入。推荐构造方法注入,代码更清晰,而且方便测试。
@Service
public class ProductService {
private final UserRepository userRepository;
@Autowired
public ProductService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void process() {
userRepository.findAllUsers().forEach(System.out::println);
}
}
与配置相关的注解:@Configuration和@Value
@Configuration这是Spring用来定义配置类的核心注解。所有用@Bean标注的方法,都会生成一个Spring容器里的Bean实例。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
@Value主要用于注入配置文件中的属性值。
app.name=MyApp
@Component
public class AppProperties {
@Value("${app.name}")
private String appName;
public String getAppName() {
return appName;
}
}
路径映射注解:@RequestMapping和派生注解
- @RequestMapping:用来指定Controller的请求路径和HTTP方法。
- @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:这些是@RequestMapping的简化版。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
return "User_" + id;
}
}
好了,我们来看看面试中Spring Boot注解相关问题
- @SpringBootApplication的作用是什么?它包含了哪些注解? 最优回答:@SpringBootApplication是Spring Boot应用的入口点,包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。
- @Autowired默认按什么方式注入?如何避免循环依赖? 最优回答:@Autowired默认按类型注入,通过@Qualifier可以按名称注入。避免循环依赖的方法包括使用构造方法注入和拆分依赖关系。
- @Configuration和@Bean的区别是什么? 最优回答:@Configuration标记一个类为配置类,而@Bean标记一个方法返回的对象是Spring容器管理的Bean。
- Spring Boot如何加载配置文件的? 最优回答:Spring Boot默认加载application.properties或application.yml,优先级从类路径的config目录到类路径根目录,再到外部配置文件。