java——SpringBoot中常用注解及其底层原理

SpringBoot中的注解是简化配置、自动装配组件和实现声明式服务的关键。以下是对SpringBoot中常用注解及其底层原理的详细解析:

常用注解

  1. @SpringBootApplication

    • 标注在主程序类上,表示这是一个Spring Boot应用的入口。
    • 它是一个复合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan。
      @SpringBootApplication
      public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
      }

  2. @EnableAutoConfiguration

    • 启用Spring Boot的自动配置机制,根据添加的依赖和配置文件自动配置Spring应用。
      @EnableAutoConfiguration
      public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
      }

  3. @Configuration

    • 标识一个类作为配置类,相当于传统的Spring XML配置文件。
    • 可以包含一个或多个@Bean方法。
      @Configuration
      public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
      }

  4. @ComponentScan

    • 指定要扫描的包,以便发现和注册Spring组件。
    • 默认情况下,扫描主应用类所在的包及其子包。
      @ComponentScan(basePackages = "com.example")
      public class MyApplication {
      }

  5. @Component

    • 将一个类标识为Spring组件(Bean),可以被Spring容器自动检测和注册。
    • 通用注解,适用于任何层次的组件。
      @Component
      public class MyComponent {
      }

  6. @Service

    • 标识服务层组件,实际上是@Component的一个特化,用于表示业务逻辑服务。
      @Service
      public class MyService {
      }

  7. @Repository

    • 标识持久层组件(dao层),实际上是@Component的一个特化,用于表示数据访问组件。
    • 常用于与数据库交互。
      @Repository
      public class MyRepository {
      }

  8. @Controller

    • 标识控制层组件,实际上是@Component的一个特化,用于表示Web控制器。
    • 处理HTTP请求并返回视图或响应数据。
      @Controller
      public class MyController {
      }

  9. @RestController

    • 标识RESTful Web服务的控制器,实际上是@Controller和@ResponseBody的结合。
    • 返回的对象会自动序列化为JSON或XML,并写入HTTP响应体中。
      @RestController
      public class MyRestController {
      }

  10. @RequestMapping

    • 映射HTTP请求到处理方法上(支持GET、POST、PUT、DELETE等)。
      @Controller
      public class MyController {@RequestMapping("/hello")public String sayHello() {return "hello";}
      }

  11. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

    • 映射HTTP请求到处理方法上,是@RequestMapping的简化版本。
      @RestController
      public class MyRestController {
      /*
      @GetMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.GET)
      @PostMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.POST)
      @PutMapping("/users/{userId}") 等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
      */
      @DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)@GetMapping("/users")public List<User> getUsers() {return userService.getAllUsers();}
      }

  12. @ResponseBody

    • 将方法的返回值转换为指定格式(如JSON、XML)作为HTTP响应的内容返回给客户端。
    • 常用于RESTful服务中。
      @RestController
      public class MyRestController {@GetMapping("/hello")@ResponseBodypublic String sayHello() {return "Hello, World!";}
      }

  13. @RequestBody

    • 将HTTP请求体的内容(如JSON、XML)转换为Java对象。
    • 常用于接收前端传递的数据。
      @RestController
      public class MyRestController {@PostMapping("/users")public User createUser(@RequestBody User user) {return userService.createUser(user);}
      }

  14. @Autowired

    • 用于自动注入依赖对象。
      @Autowired
      @Qualifier("baseDao")
      private BaseDao baseDao;

  15. @Qualifier

    • 用于指定注入特定名称的bean。

底层原理

  • 自动配置:Spring Boot 自动配置的核心在于 @EnableAutoConfiguration。它利用了 Spring 的条件化配置机制(@Conditional),结合 spring.factories 文件中定义的自动配置类列表,根据类路径中是否存在某些特定的类、环境变量等条件来决定是否应用某个配置。

  • 组件扫描@ComponentScan 注解使得 Spring 能够在指定的包路径下查找带有 @Component, @Service, @Repository, @Controller 等注解的类,并将它们注册为 Spring Bean。

  • 依赖注入@Autowired 注解的背后是 Spring 的依赖注入机制。Spring 使用反射技术来识别需要注入的字段、构造函数或方法,并从容器中获取合适的 Bean 来完成注入。

  • 条件化配置@Conditional 及其子注解(如 @ConditionalOnProperty)允许开发者根据特定条件来选择性地激活配置。这使得同一个应用可以根据不同的运行环境(如开发、测试、生产)加载不同的配置。

  • 属性绑定:Spring Boot 支持通过 application.propertiesapplication.yml 文件来配置应用属性。这些属性可以通过 @Value 注解直接注入到 Bean 中,或者通过 @ConfigurationProperties 注解与 Java 类绑定,从而实现更复杂的配置管理。

总之,SpringBoot中的注解和自动配置机制大大简化了Spring应用的开发过程。通过理解这些注解的底层原理,可以更好地掌握SpringBoot的开发技巧并提高工作效率。

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

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

相关文章

redis-cluster集群搭建

集群节点信息 192.168.222.131:46379 主要节点1 192.168.222.131:46380 从节点1 192.168.222.131:46381 从节点2192.168.222.132:46379 主要节点2 192.168.222.132:46380 从节点1 192.168.222.132:46381 从节点2192.168.222.133:46379 主要节点3 192.168.222.133:46380 从节点…

探索Python WebSocket新境界:picows库揭秘

文章目录 探索Python WebSocket新境界&#xff1a;picows库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;picows库概述第三部分&#xff1a;安装picows库第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解决方案第…

QT-installEventFilter

installEventFilter 是 Qt 框架中的一个方法&#xff0c;用于在对象之间建立事件过滤机制。具体来说&#xff0c;它允许一个对象&#xff08;称为事件过滤器&#xff09;监视另一个对象&#xff08;称为被监视对象&#xff09;的事件&#xff0c;并在这些事件被处理之前对其进行…

dmdba用户资源限制ulimit -a 部分配置未生效

dmdba用户资源限制ulimit -a 部分配置未生效 1 环境介绍2 数据库实例日志报错2.1 mpp01 实例日志报错2.2 mpp02 实例日志报错 3 mpp02 服务器资源限制情况4 关闭SELinux 问题解决4.1 临时关闭 SELinux4.2 永久关闭 SELinux 5 达梦数据库学习使用列表 1 环境介绍 Cpu x86 Os Ce…

Linux基本指令的使用

当然可以&#xff01;以下是一些常用的Linux指令及其示例&#xff1a; 1. ls 列出目录内容。 ls 显示当前目录下的文件和文件夹。 ls -l 以详细格式列出文件和文件夹的信息&#xff08;如权限、拥有者、大小等&#xff09;。 2. cd 改变当前目录。 cd /path/to/dire…

安卓悬浮窗应用外无法穿透事件问题

现象&#xff1a; 应用内悬浮窗如何设置了 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE在自己应用内事件穿透正常&#xff0c;但到应用外就无法点击。 原因&#xff1a; 解决方法&#xff1a; layoutParams.alpha 0.8f …

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…

ubuntu+ROS推视频流至网络

目录 概述 工具 ros_rtsp 接受流 web_video_server 源码安装 二进制安装 ros接收rtsp视频流 总结 概述 ros_rtsp功能包可以将ros视频流以rtsp形式推送 web_video_server功能包可以将ros视频话题推HTTP流 rocon_rtsp_camera_relay可以接受同一网段下的rtsp视频流输出为…

探索光耦:光耦安全标准解读——确保设备隔离与安全的重要规范

在现代科技日新月异的今天&#xff0c;光耦&#xff08;光电耦合器&#xff09;作为电子设备中不可或缺的隔离元件&#xff0c;其重要性不言而喻。它不仅在电源调控、工业自动化及医疗设备等关键领域大显身手&#xff0c;更是确保系统电气隔离与运行稳定的守护神。特别是在保障…

什么是 C++ 中的函数对象?它有什么特点?

在 C 中&#xff0c;函数对象&#xff08;Function Object&#xff09;是一种可调用对象&#xff0c;它允许像函数一样被调用&#xff0c;但实际上它可能并不是真正的函数。函数对象可以是以下几种类型之一&#xff1a; 普通函数&#xff1a; 一个普通的、定义在命名空间或类…

uni-app自定义底部tab并且根据字段显示和隐藏

首先将所有tab使用到的页面创建好并且在pages里面配置好&#xff0c;要在pages.json中的"tabBar里面配置"custom": true将自带的tab底部导航关闭 "pages": [{"path": "pages/mine/mine","style": {"navigationBa…

C/C++基础知识复习(31)

1) 什么是 C 中的多继承&#xff1f;它有哪些优缺点&#xff1f; 多继承&#xff08;Multiple Inheritance&#xff09;是指在 C 中&#xff0c;一个类可以继承自多个基类&#xff0c;从而拥有多个基类的特性和行为。具体来说&#xff0c;子类可以通过继承多个父类&#xff0c…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

JAVA题目笔记(二十)异常综合小练

一、键盘录入数据 import java.text.ParseException; import java.util.InputMismatchException; import java.util.Scanner;public class Co {public static void main(String[] args) throws ParseException {//键盘录入信息int age0;String namenull;Scanner sc new Scanne…

STM32F10x 定时器

使用定时器实现&#xff1a;B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…

shell脚本基础学习_总结篇(完结)

细致观看可以&#xff0c;访问shell脚本学习专栏&#xff0c;对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. S…

Linux创建免密登陆(错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic))

报错截图 解决方法 1. mkdir -p ~/.ssh 2. chmod 700 ~/.ssh 3. ssh-keygen&#xff0c;一直回车 4. chmod 600 /root/.ssh/id_rsa 5. 将公钥内容追加到服务器上&#xff0c;cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 6. chmod 600 ~/.ssh/authorized_keys…

低代码平台在医疗/医院行业应用案例与优势介绍

随着医疗行业的不断发展&#xff0c;数字化管理的需求日益迫切。传统的医疗信息化管理系统开发往往面临着成本高、周期长、定制性差等问题。在这个数字化转型的浪潮下&#xff0c;低代码平台应运而生&#xff0c;为医院快速搭建高效、灵活的医疗信息化管理系统提供了全新的解决…

【Leetcode 每日一题 - 扩展】3101. 交替子数组计数

问题背景 给你一个 二进制数组 n u m s nums nums。 如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 n u m s nums nums 中交替子数组的数量。 数据约束 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le n…

Python 网络爬虫进阶:动态网页爬取与反爬机制应对

在上一篇文章中&#xff0c;我们学习了如何使用 Python 构建一个基本的网络爬虫。然而&#xff0c;在实际应用中&#xff0c;许多网站使用动态内容加载或实现反爬机制来阻止未经授权的抓取。因此&#xff0c;本篇文章将深入探讨以下进阶主题&#xff1a; 如何处理动态加载的网…