SpringBoot必须掌握的常用注解!

Spring Boot 提供了大量的注解,用于简化配置和加速程序开发

那么接下来,咱们就一起来看下 Spring Boot 中的常用注解有哪些?及其这些注解的具体使用。

alt

1.Bean相关

  1. @Component:将一个类标识为 Spring 组件(Bean),可以被 Spring 容器自动检测和注册。通用注解,适用于任何层次的组件。
@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("MyComponent is doing something.");
    }
}
  1. @ComponentScan:自动扫描指定包及其子包中的 Spring 组件。
@ComponentScan("com.example") // 扫描com.example包下的组件,加载到Spring容器
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  1. @Controller:标识控制层组件,实际上是 @Component 的一个特化,用于表示 Web 控制器。处理 HTTP 请求并返回视图或响应数据。
@Controller
public class MyController {
    @Autowired
    private final UserService userService;

    @GetMapping("/user")
    public String getUser(Model model) {
        User user = userService.getUserById(1);
        model.addAttribute("user", user);
        return "user";
    }
}
  1. @RestController:是 @Controller 和 @ResponseBody 的结合,返回的对象会自动序列化为 JSON 或 XML,并写入 HTTP 响应体中。
@RestController
public class MyController {
    @Autowired
    private final UserService userService;

    @GetMapping("/user")
    public User getUser() {
        User user = userService.getUserById(1);
        return user;
    }
}
  1. @Service:标识服务层组件,实际上是 @Component 的一个特化,用于表示业务逻辑服务。
@Service
public class MyService {
}
  1. @Repository:标识持久层组件(DAO 层),实际上是 @Component 的一个特化,用于表示数据访问组件。常用于与数据库交互。
@Repository
public interface UserDao {
}
  1. @Bean:方法注解,用于修饰方法,主要功能是将修饰方法的返回对象添加到 Spring 容器中,使得其他组件可以通过依赖注入的方式使用这个对象。
@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
  1. @Configuration:标识一个类作为配置类,@Component 的一个特化,通常配合 @Bean 注解一起使用。
@Configuration
public class AppConfig {
}
  1. @Scope:用于声明一个 Spring Bean 实例的作用域,作用域的范围有单例模式、原型模式(多例模式)等。
@Configuration
public class AppConfig {
    @Bean
    @Scope("prototype")
    public MyPrototypeBean myPrototypeBean() {
        return new MyPrototypeBean();
    }
}

2.依赖注入

  1. @Autowired:用于自动注入依赖对象,Spring 框架提供的注解。
@RestController
public class MyController {
    @Autowired
    private final UserService userService;

    @GetMapping("/user")
    public User getUser() {
        User user = userService.getUserById(1);
        return user;
    }
}
  1. @Resource:按名称自动注入依赖对象(也可以按类型,但默认按名称),JDK 提供注解。
@RestController
public class MyController {
    @Resource
    private final UserService userService;

    @GetMapping("/user")
    public User getUser() {
        User user = userService.getUserById(1);
        return user;
    }
}
  1. @Qualifier:与 @Autowired 一起使用,用于指定要注入的 Bean 的名称。当存在多个相同类型的 Bean 时,可以使用 @Qualifier 来指定注入哪一个。
@RestController
public class MyController {
    @Autowired
    @Qualifier("userService")
    private final UserService us;

    @GetMapping("/user")
    public User getUser() {
        User user = userService.getUserById(1);
        return user;
    }
}

3.Web相关

  1. @RequestMapping:用于映射 HTTP 请求到处理方法上,支持 GET、POST、PUT、DELETE 等请求方法。可以标注在类或方法上。标注在类上时,表示类中的所有响应请求的方法都是以该类路径为父路径。
@RestController
@RequestMapping("/contoller")
public class MyController {
    @Resource
    private final UserService userService;

    @RequestMapping("/user")
    public User getUser() {
        User user = userService.getUserById(1);
        return user;
    }
}
  1. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:分别用于映射 HTTP GET、POST、PUT、DELETE 请求到处理方法上。它们是 @RequestMapping 的特化,分别对应不同的 HTTP 请求方法。
@RestController
@GetMapping("/contoller")
public class MyController {
    @Resource
    private final UserService userService;

    @GetMapping("/user")
    public User getUser() {
        User user = userService.getUserById(1);
        return user;
    }
}
  1. @RequestParam:用于将请求参数绑定到 Controller 方法的参数上。它主要用于处理 GET、POST 等请求中的查询参数,例如将 http://example.com/api?param1=value1&param2=value2 中的 param1 和 param2 参数设置到方法的参数上。
@RestController
public class MyController {
    @GetMapping("/hello")
    public String sayHello(@RequestParam("name") String userName) {
        return "Hello, " + userName;
    }
}
  1. @PathVariable:用于从请求的 URL 路径中提取变量值,并将其绑定到控制器方法的参数上。
@GetMapping("/user/{userId}")
public String getUserById(@PathVariable("userId") Long id) {
    return "User with ID " + id;
}
  1. @RequestBody:将 HTTP 请求体的内容(如 JSON、XML)转换为 Java 对象。通常用于接收前端传递的数据,标注在方法的参数上。
@Controller
public class MyController {
    @PostMapping("/submit")
    public String submitData(@RequestBody MyData myData) {
        System.out.println(myData);
        return "success";
    }
}
  1. @ResponseBody:将方法的返回值转换为指定格式(如 JSON、XML)作为 HTTP 响应的内容返回给客户端。通常与 @RequestMapping 或 @GetMapping 等注解一起使用在方法上。
@RestController
public class MyController {
    @GetMapping("/data")
    @ResponseBody
    public String getData() {
        return "Some data";
    }
}

4. 读取配置

  1. @Value:用于注入属性值,通常从配置文件中获取。标注在字段上,并指定属性值的来源(如配置文件中的某个属性)。
@Component
public class MyComponent {
    @Value("${my.property}")
    private String myPropertyValue;

    public void printValue() {
        System.out.println(myPropertyValue);
    }
}
  1. @ConfigurationProperties:用于将配置属性绑定到一个实体类上。通常用于从配置文件中读取属性值并绑定到类的字段上。
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "my.app")
public class MyAppProperties {
    private String property1;
    private int property2;

    // Getters and setters
}

5. 配置启动注解

  1. @SpringBootApplication:用于标识 SpringBoot 应用程序的入口类。它是一个组合注解,包括了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解。
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  1. @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制,根据添加的依赖和配置文件自动配置 Spring 应用。

6. 其他常用注解

  1. @Transactional:声明事务管理。标注在类或方法上,指定事务的传播行为、隔离级别等。
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {
    @Transactional
    public void performTransactionalOperation() {
        // Database operations
    }
}
  1. @Scheduled:声明一个方法需要定时执行。标注在方法上,并指定定时执行的规则(如每隔一定时间执行一次)。
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyScheduledTask {
    @Scheduled(fixedRate = 5000)
    public void performTask() {
        System.out.println("Task executed.");
    }
}

小结

Spring Boot 中的注解用很多,本文也是走马观花的带大家了解了一下 Spring Boot 中的常见注解。当然这些注解也不需要全部记住,只需有一个大概的印象即可,用的时候再查具体的使用就可以了。最后,欢迎小伙伴在评论区补充和发表更多的常用注解。

#java#
Java面试精讲 文章被收录于专栏

Java常见面试题、场景题、企业真题精讲。

全部评论

相关推荐

全程60min    1. 介绍飞书基本信息(面试官介绍:飞书,主要产品是一个多维表格 (类似 Excel 的升级版),是偏向D 代码 (Data Code)D 代码 是飞书多维表格中的一种内置公式语言,类似于 Excel 的函数。用于在多维表格中处理数据、公式计算、筛选和数据关联。)    2. 自我介绍(这一part其实没做好,就只是简单的说了一下啥时候接触后端,学习java多久了,学了一些啥)    3. 拷打项目        1. 问最熟悉哪一个项目,学到了什么(应该是想问担任的角色,掌握了的技术,problem solving的能力,解决了的问题,以及如何进行优化等),这里我只是笼统地概括了项目的框架和层次结构,大概说了一下项目过程设计的技术栈,只能说回答的不好,没经验        2. 开始八股拷打(项目引出的八股):                (抓着IoC问了很久)                1. 说一下springboot依赖注入的实现原理(DI基于 Spring IOC 容器 (Inversion of Control, 控制反转) 实现)                2. 为啥需要依赖注入,有什么好处                3. 为啥需要搞一个IoC容器呢,如果没有这个容器,你需要自己管理什么东西,这样有什么好处                4. IoC和注解之间的关系是什么,带注释的代码是不是就能实现IoC                5. IoC的含义?                6. RestFul API是啥                7. get和post有啥区别(技术上的区别,http协议上有没有区别)                8. 一个search结果发出去,使用哪一种API                9. get方法的URL上的参数叫什么参数,在java中用什么注释来解析,path parameter和query parameter的区别                10. http状态码的考核(200,302,400分别是表示什么)                11. 如果是500,那是什么情况,举一个具体例子                12. 计算机网络角度说一下输入域名呈现数据的一个过程                13. DNS如何将域名变为IP的(就是DNS的查询过程-->检查本地缓存->操作系统缓存->根域名服务器->顶级域名服务器->权威DNS服务器)                14. 三次握手双方通信需要确定哪些字段?                15. 比如说当前使用了多个远程服务,网络协议是如何将这些流量正确传输的呢                16. 假设有三台电脑 A、B 和 C,它们通过路由器共享公共 IP 地址。当A电脑发出http请求时,如何保证其与服务器正常通信?                17. 计算机网络:通信时候,五元组有哪些字段,确定通信链路的字段(其实是在引导我说出上一个问题,但是当时完全忘了)                    4. 项目拷打完,八股拷打完,开始吹水了(可能是答的不好,问点日常了):为啥选后端,学了多久。。。    5. 手撕:算法题:现在有一个数组,比如[2,1,4,3,5,7,6],叫我找出要连续的要么是递减递增(a1>a2<a3>a4...比如[2,1,4,3])或者递增到递递减(a1<a2>a3<a4..(比如[2,3,1,4]))的最大和 要求时间复杂度O(n)空间复杂度O(1)(有点像力扣的最长湍流子数组)    6.反问:需要提升什么,哪里可以提升-->基础,算法都要    7. 第一次做面试(破处了),感觉基础太薄弱了,八股背的不行,项目涉及到的底层原理也没搞明白,力扣也刷少了,总之就是啥都不够,啥都不行,啥也别说,回炉重造,继续沉淀。#牛客AI配图神器#
查看22道真题和解析
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务