SpringBoot常用注解和原理简介说明

2023-10-30

转自:

SpringBoot常用注解和原理简介说明

下文笔者讲述SpringBoot常见注解的简介说明,如下所示

启动注解@SpringBootApplication

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    // ... 此处省略源码
}

注意事项:
   1.@SpringBootApplication是一个复合注解
    包含@SpringBootConfiguration
     @EnableAutoConfiguration
     @ComponentScan这三个注解
   2.@SpringBootConfiguration注解
     继承@Configuration注解
     主要用于加载配置文件
   3.@EnableAutoConfiguration注解
      开启自动配置功能
	  可将符合条件的@Configuration配置
	  加载到IoC容器
    4.@ComponentScan注解:
	    主要用于组件扫描和自动装配
        自动扫描并加载符合条件的组件或bean定义
        最终将这些bean定义加载到容器中
      可使用basePackages等属性指定@ComponentScan自动扫描的范围
      当不指定此属性值时
       则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描
       当我们不指定属性值时,则SpringBoot的启动类最好放在root package下

Controller相关注解

@Controller
   控制器,处理http请求
@RestController 复合注解

@RestController源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     * @since 4.0.1
     */
    @AliasFor(annotation = Controller.class)
    String value() default "";
}
从以上的源码中,我们可以得出
@RestController注解相当于
   @ResponseBody+@Controller合在一起的功能

@RestController的功能:
    将方法返回的对象采用json的方式返回

@RequestBody

使用HttpMessageConverter 
  读取Request Body并反序列化为Object(泛指)对象

@RequestMapping

@RequestMapping是Spring Web应用程序中最常被用到的注解之一
  这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上

@GetMapping

@GetMapping:
   用于将HTTP get请求映射到特定处理程序的方法注解

注解简写:
   @RequestMapping(value = "/test",method = RequestMethod.GET)
    等同于@GetMapping(value = "/test")

GetMapping源码

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {
//...
}
是@RequestMapping(method = RequestMethod.GET)的缩写

@PostMapping

@PostMapping用于将HTTP post请求映射到特定处理程序的方法注解

@PostMapping源码

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.POST)
public @interface PostMapping {
    //...
}
 
 等同于@RequestMapping(method = RequestMethod.POST)的缩写

取请求参数值

@PathVariable:获取url中的数据

@Controller
@RequestMapping("/User")
public class TestController {

    @RequestMapping("/getUser/{uid}")
    public String getUser(@PathVariable("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}

示例url:http://localhost:8080/User/getUser/888

@RequestParam:获取请求参数的值

@Controller
@RequestMapping("/User")
public class HelloWorldController {

    @RequestMapping("/getUser")
    public String getUser(@RequestParam("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}

示例url:http://localhost:8080/User/getUser?uid=888
@RequestHeader 把Request请求header部分的值绑定到方法的参数上
@CookieValue 把Request header中关于cookie的值绑定到方法的参数上

注入bean相关

@Repository

DAO层注解
  DAO层中接口继承JpaRepository
  需要在build.gradle中引入相关jpa的一个jar自动加载。

Repository注解源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";

}

@Service注解源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";
}
@Service注解注意事项:
   @Service是@Component注解的一个特例,作用在类上
   @Service注解作用域默认为单例
    使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
   @Service用于标注服务层组件,表示定义一个bean
   @Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写
   @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数
     使用value作为Bean名字

@Scope作用域注解

@Scope作用在类上和方法上
  用来配置spring bean作用域
  标识bean作用域

@Scope源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {

    /**
     * Alias for {@link #scopeName}.
     * @see #scopeName
     */
    @AliasFor("scopeName")
    String value() default "";

    @AliasFor("value")
    String scopeName() default "";

    ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}

属性介绍

value
    singleton   表示该bean是单例的。(默认)
    prototype   表示该bean是多例的,即每次使用该bean时都会新建一个对象。
    request     在一次http请求中,一个bean对应一个实例。
    session     在一个httpSession中,一个bean对应一个实例。

proxyMode
    DEFAULT         不使用代理。(默认)
    NO              不使用代理,等价于DEFAULT。
    INTERFACES      使用基于接口的代理(jdk dynamic proxy)。
    TARGET_CLASS    使用基于类的代理(cglib)。

@Entity实体类注解

@Table(name =“数据库表名”),这个注解也注释在实体类上,对应数据库中相应的表。
@Id、@Column注解用于标注实体类中的字段,pk字段标注为@Id,其余@Column。

@Bean产生一个bean的方法

@Bean明确地指示了一种方法
  产生一个bean的方法
  交给Spring容器管理
  支持别名@Bean(“xx-name”)

@Autowired 自动导入

@Autowired注解作用在构造函数、方法、方法参数、类字段以及注解上
@Autowired注解可以实现Bean的自动注入

@Component

可将普通pojo实例化到spring容器中

导入配置文件

@PropertySource注解

1.引入单个properties文件:
   @PropertySource(value = {"classpath : xxxx/xxx.properties"})

2.引入多个properties文件:
   @PropertySource(value = {"classpath : xxxx/xxx.properties","classpath : xxxx.properties"})

3.@ImportResource导入xml配置文件
  可以额外分为两种模式 相对路径classpath,绝对路径(真实路径)file
 注意事项:
   单文件可以不写value或locations
    value和locations都可用
 例:
   引入单个xml配置文件:@ImportSource(“classpath : xxx/xxxx.xml”)
   引入多个xml配置文件:@ImportSource(locations={“classpath : xxxx.xml” , “classpath : yyyy.xml”})

绝对路径(file)
   引入单个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/dubbo.xml”})
   引入多个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/application.xml” , “file : d:/hellxz/dubbo.xml”})

取值

可使用@Value注解
  获取配置文件中的值

例:

@Value("${properties中的键}")
private String xxx;

@Import注解简介

   @Import:用于导入额外的配置信息
     用来导入配置类
     可以导入带有@Configuration注解的配置类或
	  实现ImportSelector/ImportBeanDefinitionRegistrar

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

事务注解 @Transactional

在Spring中
  事务有两种实现方式
   编程式事务管理和声明式事务管理

编程式事务管理:
   编程式事务管理使用TransactionTemplate或
   直接使用底层的PlatformTransactionManager
  编程式事务管理,笔者建议使用TransactionTemplate

声明式事务管理:
  建立在AOP之上的
  其本质是对方法前后进行拦截
   然后在目标方法开始之前创建或加入一个事务
   在执行完目标方法之后根据执行情况提交或者回滚事务
    通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用

全局异常处理

@ControllerAdvice 统一处理异常
@ControllerAdvice 注解定义全局异常处理类

例:

@ControllerAdvice
public class GlobalExceptionHandler {
}

@ExceptionHandler:
   注解声明异常处理方法
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    String handleException(){
        return "Exception Deal!";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot常用注解和原理简介说明 的相关文章

随机推荐

  • 刷题day22:逆波兰表达式求值

    题意描述 给你一个字符串数组 tokens 表示一个根据 逆波兰表示法 表示的算术表达式 请你计算该表达式 返回一个表示表达式值的整数 类似于二叉树 可以将运算符号看做二叉树的中间节点 遇到运算符之后计算前两个数字与该运算符的运算结果 C
  • 电阻的精度和温漂

    转载自 http blog sina com cn s blog 68b345970100jc2h html 电阻的精度和温漂 1 电阻温度系数 TCR 表示电阻当温度改变1度时 电阻值的相对变化 当温度每升高1 时 导体电阻的增加值与原来
  • python 字符串去除 等等转义空格换行字符

    python去除html特殊转义字符 下面这些是一些我在网上找的一些 好像都不管用 网络上面的一些方法好像都不管用 比如 str text replace str text replace u xa0 等等一些 我使用的时候好像都不管用 下
  • 匿名内部类方式实现线程创建的三种方式

    小demo package demo04 author wh date 2021年08月30日15 57 匿名内部类方式实现线程创建的三种方式 public class demo02 public static void main Stri
  • 企业级springboot项目架构模板V4.0,开箱即用

    此次 4 0 更新点 1 添加线程池的使用 2 Springboot版本更新2 7 0 解决部分冲突的依赖 3 所有表结构去除 ID 字段 不在使用ID作为主键 主键直接使用算法生成 4 解决过滤器 引起Druid监控无法访问的问题 5 F
  • 3.4 流式操作

    1 简介 1 概念 Stream是数据渠道 用于操作数据源所生成的元素序列 它可以实现对集合的复杂操作 例如过滤 排序和映射等 集合是一种静态的数据结构 存储在内存中 而Stream是通过CPU来实现计算的 并不会存储数据 Stream不会
  • linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案

    1 问题描述 最近搭建的一个linux最小系统在运行到241秒时在控制台自动打印如下图信息 并且以后每隔120秒打印一次 仔细阅读打印信息发现关键信息是 hung task timeout secs 第一次遇到这样的问题 首先百度 通过翻看
  • 在 Java 中,读取 resources 下的文件方式(四种)

    1 测试文件具体位置 2 方式一 项目内路径 使用项目内路径读取 该路径只在开发工具中显示 所以只能在开发工具中使用 项目部署之后无法读取 不通用 SpringBootTest public class ResourcesFIleTest
  • 爱快路由器设置上网

    进入以太网络设置里面查看详细信息 也可cmdipconfig 找出网管 打开电脑的浏览器 地址栏输入 10 100 10 1 在登录界面爱快路由器帐号和密码 默认帐号 admin 默认密码 admin 点击登录 忘记密码可长按路由器重置键
  • rust入门材料清单

    rust book rustbook 配套视频教程 cargo 文档 crate io 标准库api 官方资料索引 rust 编程规范
  • js实现Math.sqrt()方法

    之前面试的时候 面试有一道题 要记算10的平方根 并且精确到0 01 我也是想了一会才想到了一种简单粗暴的方法 也算是完成了 squareRoot num gt let s 1 d 0 1 x 0 01 while s s
  • MyEclipse 8.0 中vssplugin的安装

    今天试用了myeclipse8 0 多了很多新特性 挺不错的 由于本司用的是vss库 所以vssplugin是必装项 可是安装的时候发布目录结构有所变动与myeclipse6 0有所区别 具体安装详见如下步骤 1 下载vss plugin
  • Python画爱心——谁能拒绝用代码敲出来会跳动的爱心呢~

    还不快把这份浪漫拿走 节日就快到来了 给Ta一个惊喜吧 今天给大家分享一个浪漫小技巧 利用Python中的 HTML 制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心 从里到外形成一个立体状 给人视觉上的冲击感 浪漫极了 V hw
  • div页面垂直居中方法方法

    基本思路 1 首们需要position absolute 绝对定位 而层的定位点 使用外补丁margin负值的方法 负值的大小为层自身宽度高度除以二 例子 一个层宽度是400 高度是300 使用绝对定位距离上部与左部都设置成50 而marg
  • 带你详细了解ADSS光缆

    ADSS 全介质自承式光缆 光缆是一种自支撑架空光缆 专为架空安装和部署而设计 适用于各种户外应用 本文将提供ADSS光缆的一些知识 什么是ADSS光缆 ADSS 光缆是一种光缆 其强度足以在结构之间支撑自身 而无需使用导电金属元件 该光缆
  • 创建qml自定义视频源(Qt5.15.2+设备帧)

    前言 若是看过笔者之前的文档 应该会注意到 笔者显示自定义视频 使用的是QQuickImageProvider和Image类型实现 本次笔者记录另一种显示方式 创建视频源 然后使用VideoOutput显示 因为Qt5和Qt6多媒体模块发生
  • QML自定义模块及qmldir的使用

    前言 在开发QtQuick项目中 当项目文件很多的情况下 可能会分成多级文件夹来进行分类 还有一些通用类型文件 如公共组件 通用配置等等 需要在各个不同的文件中进行调用 这种情况下 一种方式是在当前需要引用的文件中通过关键字import 加
  • TCP-三次握手

    文章目录 三次握手 简单示意图 详细分析 一些思考 为什么是三次握手 SYN 攻击 什么是SYN 攻击 如何防止SYN 攻击 数据包丢失了该怎么办 初始序列号为什么随机产生 为什么 SYN 段不携带数据却要消耗一个序列号呢 每次握手可以确定
  • 数据库驱动和数据库连接(MySQL)

    数据库驱动和数据库连接 MySQL 一 数据库驱动 什么是数据库驱动 二 数据库连接 jdbc连接的方式以及区别 1 通过DriverManager 驱动管理类 的静态方法获取 2 通过DataSource 数据源 对象获取 3 两种创建连
  • SpringBoot常用注解和原理简介说明

    转自 SpringBoot常用注解和原理简介说明 下文笔者讲述SpringBoot常见注解的简介说明 如下所示 启动注解 SpringBootApplication Target ElementType TYPE Retention Ret