Spring Boot开发中常用注解总结【建议收藏】

news2024/9/17 4:42:04

Spring Boot 是一款非常流行的 Java 框架,其注解用法复杂而丰富。 在介绍 Spring Boot 的注解之前,我们需要先了解 Spring框架中的 AOP(面向切面编程)概念。

Spring 的 AOP 可以帮助开发者实现一些非业务功能的代码,如日志记录、性能监控等。这些功能可以通过定义一个 Aspect (切面)类来实现。

在 Spring Boot 中,除了常规的AOP注解外,还有以下几类注解,这也是我看到一个脑图后的一点点收获,想要自己也能够总结总结所用到的注解,常记定能有所感悟。

1. 核心注解 
2. 原型注解 
3. SpringBoot注解 
4. SpringCloud注解 
5. 缓存注解 
6. 测试注解 
7. 数据库访问注解 
8. JPA注解 
9. SpringMVC跟REST注解 
10. 全局异常处理注解 

接下来我们将分别介绍这几类注解及其使用方法。

一、核心注解

@Configuration

@Configuration 注解可以被用来标记一个类,表示这个类是一个 Bean 配置类。在配置类中,我们可以使用其他 Bean 的定义和依赖,甚至可以使用 @Autowired@Value 注解将其他 Bean 注入到当前的 Bean 中。下面是一个简单的例子:

@Configuration  
public class AppConfig {  
    @Bean  
    public MyService myService() {  
        return new MyServiceImpl();  
    }  
}  

@Autowired

@Autowired 注解可以将一个 Bean 自动注入到当前类中。默认情况下, @Autowired
的匹配规则是根据类型进行匹配。如果有多个类型相同的 Bean,可以使用 @Qualifier 进行限定。

@Component  
public class MyController {  
    private final MyService myService;  
  
    @Autowired  
    public MyController(MyService myService) {  
        this.myService = myService;  
    }  
}  

@Value

@Value 注解用于从配置文件或环境变量中获取值,可以注入 String、int、long、double、boolean 等类型。使用 ${} 可以引用配置文件中的属性,使用 $() 可以引用系统环境变量。

例如:

@Component  
public class MyComponent {  
    @Value("${my.config.property}")  
    private String configProperty;  
  
    @Value("$MY_ENV_VAR")  
    private String envVar;  
}  

@Bean

@Bean 注解用于定义一个 Bean,将其加入到 Spring 容器中。通常在 @Configuration 类中使用。可以指定该
Bean 的名称、作用域、相关依赖等。

@Configuration  
public class AppConfig {  
    @Bean(name = "myService", scope = ConfigurableBeanFactory.SCOPE_PROTOTYPE)  
    public MyService myService() {  
        return new MyServiceImpl();  
    }  
}  

@ComponentScan

@ComponentScan 注解用于扫描包中的组件(包括 Bean、Controller 等),将这些组件加入到 Spring 容器中。

@Configuration  
@ComponentScan(basePackages = { "com.example" })  
public class AppConfig {  
}  

@EnableAutoConfiguration

@EnableAutoConfiguration 注解可以自动配置 Spring Boot 应用程序。在启用该注解时,Spring Boot将根据类路径和配置文件中的信息来尝试猜测并配置应用程序。

@SpringBootApplication  
public class MyApp {  
    public static void main(String[] args) {  
        SpringApplication.run(MyApp.class, args);  
    }  
}  

二、原型注解

@Scope

@Scope 注解用于设置 Bean 的作用域,包括 Singleton、Prototype、Request、Session
等。默认情况下,Bean 是 Singleton 的。

@Configuration  
public class AppConfig {  
    @Bean(name = "myService")  
    @Scope( ConfigurableBeanFactory.SCOPE_PROTOTYPE )  
    public MyService myService() {  
        return new MyServiceImpl();  
    }  
}  

@Lazy

@Lazy 注解用于标记一个 Bean 延迟初始化。当容器从 XML 文件、Java 配置类或其他方式加载时,不会创建这个 Bean。

@Configuration  
public class AppConfig {  
    @Bean(name = "myService")  
    @Lazy  
    public MyService myService() {  
        return new MyServiceImpl();  
    }  
}  

@DependsOn

@DependsOn 注解用于标识 Bean 之间的依赖关系。在容器启动时,先创建 @DependsOn 注解中指定的 Bean,再创建当前Bean。

@Configuration  
public class AppConfig {  
    @Bean(name = "myService")  
    public MyService myService() {  
        return new MyServiceImpl();  
    }  
  
    @Bean(name = "myController")  
    @DependsOn("myService")  
    public MyController myController() {  
        return new MyController(myService());  
    }  
}  

三、SpringBoot注解

@SpringBootApplication

@SpringBootApplication 注解是一个组合注解,等价于同时使用 @Configuration@EnableAutoConfiguration@ComponentScan 注解。它用于标记主类,并告诉 Spring Boot启动该应用程序。

@SpringBootApplication  
public class MyApp {  
    public static void main(String[] args) {  
        SpringApplication.run(MyApp.class, args);  
    }  
}  

@RestController

@RestController 注解表示控制器中所有方法都返回 JSON 格式数据。它是 Spring MVC 中 @Controller
注解的扩展。下面是一个简单的例子:

@RestController  
public class MyController {  
    @GetMapping("/greeting")  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@RequestMapping

@RequestMapping 注解用于映射 HTTP 请求。可以使用 value 属性指定 URL 映射,使用 method属性指定请求方法。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @GetMapping("/greeting")  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@GetMapping

@GetMapping 注解等同于 @RequestMapping(method = RequestMethod.GET) ,用于映射
HTTP GET 请求。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @GetMapping("/greeting")  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@PostMapping

@PostMapping 注解等同于 @RequestMapping(method = RequestMethod.POST) ,用于映射HTTP POST 请求。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @PostMapping("/greeting")  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@PutMapping

@PutMapping 注解等同于 @RequestMapping(method = RequestMethod.PUT) ,用于映射HTTP PUT 请求。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @PutMapping("/greeting")  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@DeleteMapping

@DeleteMapping 注解等同于 @RequestMapping(method = RequestMethod.DELETE)
,用于映射 HTTP DELETE 请求。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @DeleteMapping("/greeting")  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@RequestParam

@RequestParam 注解用于将请求参数映射到方法的参数中。可以使用 value 属性指定参数名,使用 required属性指定是否必填,使用 defaultValue 属性指定默认值。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @GetMapping("/greeting")  
    public String greeting(@RequestParam("name") String name) {  
        return "Hello, " + name + "!";  
    }  
}  

@PathVariable

@PathVariable 注解用于将 URL 中的占位符映射到方法的参数中。可以使用 value 属性指定占位符名称。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @GetMapping("/{name}")  
    public String greeting(@PathVariable("name") String name) {  
        return "Hello, " + name + "!";  
    }  
}  

@RequestBody

@RequestBody 注解用于从请求体中获取数据。通常用于处理 POST、PUT 请求。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @PostMapping("/greeting")  
    public String greeting(@RequestBody GreetingRequest request) {  
        return "Hello, " + request.getName() + "!";  
    }  
}  
  
public class GreetingRequest {  
    private String name;  
  
    // getters and setters  
}  

@ResponseBody

@ResponseBody 注解表示该方法返回的结果直接输出到响应体中。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @GetMapping("/greeting")  
    @ResponseBody  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@ResponseStatus

@ResponseStatus 注解用于指定请求处理完成后的状态码。

@RestController  
@RequestMapping("/api")  
public class MyController {  
    @GetMapping("/greeting")  
    @ResponseStatus(HttpStatus.OK)  
    public String greeting() {  
        return "Hello, world!";  
    }  
}  

@ExceptionHandler

@ExceptionHandler 注解用于处理请求抛出的异常。

@RestControllerAdvice  
public class GlobalExceptionHandler {  
    @ExceptionHandler(IllegalArgumentException.class)  
    @ResponseStatus(HttpStatus.BAD_REQUEST)  
    public ErrorResult handleIllegalArgumentException(IllegalArgumentException ex) {  
        return new ErrorResult(ex.getMessage());  
    }  
}  
  
public class ErrorResult {  
    private String message;  
  
    public ErrorResult(String message) {  
        this.message = message;  
    }  
  
    // getters and setters  
}  

四、SpringCloud注解

@EnableDiscoveryClient

@EnableDiscoveryClient 注解用于启用服务发现功能。使用该注解后,应用程序能够将自己注册到 Eureka服务器,并从中获取其他实例的信息。

@SpringBootApplication  
@EnableDiscoveryClient  
public class MyApp {  
    public static void main(String[] args) {  
        SpringApplication.run(MyApp.class, args);  
    }  
}  

@LoadBalanced

@LoadBalanced 注解用于标记 RestTemplate Bean,以启用负载均衡功能。在使用 REST 请求时,RestTemplate将根据服务名自动选择一个可用的实例。

@Configuration  
public class AppConfig {  
    @Bean  
    @LoadBalanced  
    public RestTemplate restTemplate() {  
        return new RestTemplate();  
    }  
}  

@FeignClient

@FeignClient 注解用于定义一个 Feign 客户端。Feign 是一款用于简化 HTTP API 客户端的工具,它支持声明式 REST客户端。使用 @FeignClient 注解后,我们可以通过接口来调用具有相同功能的微服务。

@FeignClient(name = "my-service")  
public interface MyServiceClient {  
    @GetMapping("/greeting")  
    String greeting();  
}  

五、缓存注解

@Cacheable

@Cacheable 注解表示方法的结果应该被缓存起来,下次调用该方法时,如果参数和之前相同,则返回缓存结果。

@Service  
public class MyService {  
    @Cacheable("greetingCache")  
    public String greeting(String name) {  
        return "Hello, " + name + "!";  
    }  
}  

@CachePut

@CachePut 注解表示方法的结果应该被缓存起来,下次调用该方法时,不会返回缓存结果,而是重新计算结果并缓存起来。

@Service  
public class MyService {  
    @CachePut("greetingCache")  
    public String greeting(String name) {  
        return "Hello, " + name + "!";  
    }  
}  

@CacheEvict

@CacheEvict 注解表示方法执行后从缓存中删除指定项。

@Service  
public class MyService {  
    @CacheEvict("greetingCache")  
    public void clearGreetingCache() {  
    }  
}  

六、测试注解

@SpringBootTest

@SpringBootTest 注解用于测试 Spring Boot 应用程序。它会创建一个完整的 Spring
应用程序上下文,并在测试期间使用它。

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)  
public class MyControllerTest {  
    @Autowired  
    private TestRestTemplate restTemplate;  
  
    @Test  
    public void testGreeting() {  
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("/api/greeting", String.class);  
        assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);  
        assertThat(responseEntity.getBody()).isEqualTo("Hello, world!");  
    }  
}  

@MockBean

@MockBean 注解用于模拟一个 Bean 的实现。在测试过程中,可以使用 Mockito.when() 等方法来指定一些行为。

@SpringBootTest  
public class MyServiceTest {  
    @Autowired  
    private MyService myService;  
  
    @MockBean  
    private MyRepository myRepository;  
  
    @Test  
    public void testFindById() {  
        Mockito.when(myRepository.findById(1L)).thenReturn(Optional.of(new MyEntity()));  
        MyEntity entity = myService.findById(1L);  
        assertThat(entity).isNotNull();  
        Mockito.verify(myRepository).findById(1L);  
    }  
}  

七、数据库访问注解

@Transactional

@Transactional 注解用于指定一个方法需要在事务中执行。默认情况下,只有 RuntimeException 会触发事务回滚。

@Service  
public class MyService {  
    @Autowired  
    private MyRepository myRepository;  
  
    @Transactional  
    public void save(MyEntity entity) {  
        myRepository.save(entity);  
    }  
}  

@Repository

@Repository 注解用于标记数据访问层,表示这个类是一个数据仓库。

@Repository  
public interface MyRepository extends JpaRepository<MyEntity, Long> {  
}  

@Entity

@Entity 注解用于标记实体类,表示这个类是一个 JPA 实体。它与数据库中的表相对应。

@Entity  
@Table(name = "my_entity")  
public class MyEntity {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    // getters and setters  
}  

@Id

@Id 注解用于标记主键字段。

@Entity  
@Table(name = "my_entity")  
public class MyEntity {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    // getters and setters  
}  

@GeneratedValue

@GeneratedValue 注解用于指定主键的生成策略。

@Entity  
@Table(name = "my_entity")  
public class MyEntity {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    // getters and setters  
}  

@Column

@Column 注解用于指定实体属性与数据库表列之间的映射关系。

@Entity  
@Table(name = "my_entity")  
public class MyEntity {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @Column(name = "name")  
    private String name;  
  
    // getters and setters  
}  

八、JPA注解

@EnableJpaRepositories

@EnableJpaRepositories 注解用于启用 Spring Data JPA 功能。它会自动配置 Spring Data JPA相关的 Bean。

@SpringBootApplication  
@EnableJpaRepositories  
public class MyApp {  
    public static void main(String[] args) {  
        SpringApplication.run(MyApp.class, args);  
    }  
}  

@Query

@Query 注解用于自定义查询语句。

@Repository  
public interface MyRepository extends JpaRepository<MyEntity, Long> {  
    @Query("select e from MyEntity e where e.name = :name")  
    List<MyEntity> findByName(@Param("name") String name);  
}  

九、SpringMVC跟REST注解

SpringMVC跟REST注解——图解

十、全局异常处理注解

@ControllerAdvice

@ControllerAdvice 注解用于定义一个全局异常处理类,用于捕获所有控制器中抛出的异常,进行统一处理。

@ControllerAdvice  
public class GlobalExceptionHandler {  
    @ExceptionHandler(Exception.class)  
    public ModelAndView handleException(HttpServletRequest request, Exception ex) {  
        ModelAndView mav = new ModelAndView();  
        mav.addObject("exception", ex);  
        mav.addObject("url", request.getRequestURI());  
        mav.setViewName("error");  
        return mav;  
    }  
}  

以上是 Spring Boot 中常见的注解和使用方法,终于干完了,虽然相关注解还有很多,以后一点一点充实这篇文章吧。

来源:juejin.cn/post/7239279470250934327

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3:封装Table 表格组件

组件官网 elementPlus : 点击跳转 封装组件 创建新的组件文件: Table.vue <!-- PropTableS &#xff1a; 父组件传递过来的数据 (对象)PropTableS.tables : 父组件传递的对象中 存放表格每行显示的数据PropTableS.keyS &#xff1a; 父组件传递过来的对象&#xff0c;里…

第十四 Elasticsearch介绍和安装

docker-compose安装 kibana: image: docker.elastic.co/kibana/kibana:7.5.1 container_name: kibana ports: - "5601:5601" environment: ELASTICSEARCH_HOSTS: http://elasticsearch:9200 depends_on: - elasticsearch…

所有平台均可发布,矩阵操作+工具+素材,自动混剪8090后怀旧视频

“怀旧”这个词对于80、90后来说&#xff0c;总能勾起一阵阵心中的涟漪。无论是那些留存在记忆深处的动画经典&#xff0c;还是代代相传的游戏主题曲&#xff0c;亦或是那个时代特有的玩具&#xff0c;都构成了他们共同的美好回忆。就像乘坐一艘穿梭机&#xff0c;怀旧视频能够…

Vectorworks 2024 Mac安装包下载Vectorworks 2024安装教程3D建模设计工具

安装 步骤 1&#xff0c;双击下载好的安装包&#xff0c;打开。 2&#xff0c;将G1DXHL.ldf拖到桌面上备用。 3&#xff0c;返回打开的镜像 选择install vectorworks2024 双击打开启动安装程序。电脑就90hi高腰腿疼痛和Y&Aaa9yY 4&#xff0c;输入电脑密码。 5&#xff0…

小短片创作-优化场景并输出短片(二)

1、什么是潮湿感 什么是潮湿感&#xff1a;基础颜色变化粗糙度变化表面渗入性 1.基础颜色变化&#xff1a;潮湿的地方颜色会变深 2.粗糙度变化&#xff1a;镜面粗糙度为0&#xff0c;潮湿的地方粗糙度会变低 3.表面渗入性&#xff1a;主要看材质是否防水 2、调整场景材质增…

flinkcdc 3.0 源码学习之客户端flink-cdc-cli模块

注意 : 本文章是基于flinkcdc 3.0 版本写的 我们在前面的文章已经提到过,flinkcdc3.0版本分为4层,API接口层,Connect链接层,Composer同步任务构建层,Runtime运行时层,这篇文章会对API接口层进行一个探索.探索一下flink-cdc-cli模块,看看是如何将一个yaml配置文件转换成一个任务…

2000.1-2022.06.17中国经济政策不确定性指数日度数据

2000.1-2022.06.17中国经济政策不确定性指数数据&#xff08;日度&#xff09; 1、时间&#xff1a;2001.1.1-2022.06.17 2、指标&#xff1a;CNEPU&#xff08;经济政策不确定性指数&#xff09; 3、来源&#xff1a;China Economic Policy Uncertainty Index 4、用途&…

一文了解ai问答机器人:特点、应用、影响

很多人都听过ai问答机器人这个词&#xff0c;也许对于大部分人来说&#xff0c;对它的印象就是智能&#xff01;这是不可置疑的。你在生活中肯定也接触了不少的ai问答机器人。但是关于ai问答机器人&#xff0c;你是否了解它的特点、应用领域和对人类未来的影响呢&#xff1f;Lo…

CEF框架:各种各样的Handle(四)——CefURLRequest,发起HTTP请求与处理

文章目录 CEF的HTTP请求类CefResourceRequestCefURLRequest CefURLRequest的使用cef_message_routehandled&#xff1a;urlrequet的处理类OnQuery CefURLRequestClient CEF的HTTP请求类 在CEF框架中&#xff08;Chromium Embedded Framework&#xff09;&#xff0c;CefURLReq…

ChaosMeta V0.7.0 版本发布 进入CNCF混沌工程全景图

混沌工程 ChaosMeta 的全新版本 V0.7.0 现已正式发布&#xff01;该版本包含了许多新特性和增强功能&#xff0c;在编排界面提供了多集群管理&#xff0c;在代码层面支持多命令下发通道的选择。另外由蚂蚁集团发起的ChaosMeta于北京时间2024年1月10日正式进入CNCF混沌工程全景图…

攻击者常用的五个数据中转网站

近来&#xff0c;各种数据中转网站被攻击者广泛用于传播代码片段、配置文件和各种文本数据&#xff0c;尽管这为研究人员提供了观察的窗口&#xff0c;但敏感信息被上传到互联网上时&#xff0c;也会对受害者构成巨大威胁。 这些网站通常并不需要注册或者身份验证&#xff0c;…

AI大模型日报#0527:豆包大模型披露评测成绩、天工AI日活超100万、AI初创集体跳槽OpenAI

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

9.游戏中真正的无敌

上一个内容&#xff1a;8.什么是HOOK 在 7.封装读写游戏数据的功能2 中写是无限循环给生命值的内存地址赋值达到无敌的效果&#xff0c;这个方式有很大的弊端比如如果怪物的攻击力很高我们碰一下我们就得死这样的情况无限赋值也没用了&#xff0c;所以给内存写值的方式实现的无…

HTTP 与 HTTPS 对比

HTTP&#xff1a;HTTPS&#xff1a;超文本传输协议 超文本传输安全协议加入SSL/TLS协议&#xff0c;依靠证书来验证服务器的身份需要到CA申请证书&#xff0c;需要一定费用TCP 协议 80 端口 TCP 协议 443 端口更耗费服务器资源

深度学习环境安装教程-anaconda-python-pytorch

首先是anaconda的安装&#xff0c;可以从下面地址下载安装包 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 尽量选择最新的日期的anaconda进行安装&#xff0c;我这里是windows电脑&#xff0c;因此选择了windos-x86_64.exe&#xf…

idea中git拉取失败

之前clone好好的&#xff0c;今天突然就拉取不下来了。很多时候是用户凭证的信息没更新的问题。由于window对同一个地址都存储了会话。如果是新的会话&#xff0c;必须要更新window下的凭证。 然后根据你的仓库找到你对应的账户&#xff0c;更新信息即可。

Windows10映射网络驱动器之后不显示映射盘

目录 背景解决步骤1、按 Windows R 打开运行2、打开注册表编辑器3、 System上新建-- DWORD(32bit)4、对新建的文件重命名5、将EnableLinkedConnections的数值改为16、退出注册表编辑器&#xff0c;重启系统。 知识扩展断开连接备份注册表 背景 目前有一台NAS服务器,和一台lin…

知了汇智赵老师:揭秘OpenHarmony鸿蒙设备开发新路径

在数字化浪潮风起云涌的今天&#xff0c;鸿蒙系统作为华为自主研发的分布式操作系统&#xff0c;正以其强大的生态构建能力和广泛的应用前景&#xff0c;引领着物联网领域的新潮流。在这个关键时刻&#xff0c;知了汇智作为产教融合平台型服务机构&#xff0c;勇担时代使命&…

网络通讯聊天工具的实现

学习网络与通信&#xff0c;实现聊天界面能够通过服务器进行私聊和群聊的功能。 1.服务器&#xff1a;ServeSocket 客户端先发送消息给服务器&#xff0c;服务器接受消息后再发送给客户端。 利用服务器随时监听。等待客户端的请求&#xff0c;一旦有请求便生产一个socket套接…

openEuler系统通过shell脚本安装openGauss 5.0.0企业版

上次提到的开机自启动的配置&#xff0c;获得了LD的称赞&#xff0c;然而LD的要求&#xff0c;都是“既得陇复望蜀”的&#xff0c;他又期望我们能实现openGauss安装的“自动化”&#xff0c;于是尝试了下用shell脚本部署&#xff0c;附件中的脚本实测有效&#xff0c;openEule…