摘要:今天咱们聊聊Spring Boot里面那些让人“恨不得立刻记住”的注解。说实话,每次面试都绕不开Spring Boot的注解相关问题,尤其是配置类、主类这些核心点,弄不好直接变成面试“滑铁卢”。
今天咱们聊聊Spring Boot里面那些让人“恨不得立刻记住”的注解。说实话,每次面试都绕不开Spring Boot的注解相关问题,尤其是配置类、主类这些核心点,弄不好直接变成面试“滑铁卢”。
那么话不多说,我来细细捋一捋这些注解背后的知识点,还给大家来点代码举例和面试场景模拟。
先从最熟悉的@@SpringBootApplication说起吧。
这个注解几乎是Spring Boot应用的开门砖。它同时包含了以下三个注解的功能:
@SpringBootConfiguration:标识当前类是配置类,相当于传统Spring中的@Configuration。@EnableAutoConfiguration:开启Spring Boot的自动配置功能。@ComponentScan:让Spring Boot扫描标注了@Component、@Service、@Repository、@Controller等注解的类,把它们注册到Spring容器中。用法很简单,一般直接加在主类上:
@SpringBootApplicationpublic 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请求。通常返回的是视图页面的名称。
@Controllerpublic class HomeController { @RequestMapping("/home") public String home { return "home"; // 返回的是视图的名字,比如 home.html }}@RestController这个是@Controller和@ResponseBody的结合体,直接返回数据而不是视图。
@RestControllerpublic class ApiController { @GetMapping("/api/data") public String getData { return "Hello, World!"; // 直接返回JSON格式的数据 }}@Service用于标识服务层,主要承载业务逻辑,没啥特殊功能,但能让代码更清晰。
@Servicepublic class UserService { public String getUserById(Long id) { return "User_" + id; }}@Repository专为数据访问层设计,主要是标记数据库操作的类,Spring会为它生成代理类,处理异常。
@Repositorypublic class UserRepository { public List findAllUsers { return List.of("User1", "User2", "User3"); }}@Component是个通用型的注解,所有受Spring管理的类都能用它来标记。但为了分层清晰,尽量用上面具体的注解。
@Componentpublic class GenericComponent { public void doSomething { System.out.println("Doing something..."); }}自动装配的神器:@Autowired
当某个类需要使用Spring容器里的Bean时,用@Autowired可以直接注入。它支持字段注入、构造方法注入和Setter注入。推荐构造方法注入,代码更清晰,而且方便测试。
@Servicepublic 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实例。
@Configurationpublic class AppConfig { @Bean public MyService myService { return new MyService; }}@Value主要用于注入配置文件中的属性值。
app.name=MyApp@Componentpublic class AppProperties { @Value("${app.name}") private String appName; public String getAppName { return appName; }}@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目录到类路径根目录,再到外部配置文件。来源:麻辣小王子