• Spring ,Spring MVC,Spring Boot


    Spring框架

    Spring框架的作用

    Spring 框架主要解决了创建对象,管理对象的问题

    Spring 框架的依赖项

    当项目中需要使用Spring框架时,需要添加依赖项是: spring-context

    Spring 框架创建对象的做法

    Spring框架创建对象有2中做法:

    • 在任何配置类(添加了@Configuration)中,自定义方法,返回某种类型(你需要的)对象,并在方法上添加@Bean注解
      • 此方法创建出来的对象,在Spring容器中名称就是方法名称.
      • 此方法应该是public
      • 此方法的返回值类型,是你期望Spring框架处理的类型
      • 此方法的参数列表,应该为空
      • 此方法的方法体,应该是自行设计的,没有要求
    • 配置组件扫描,并在组件类上添加组件注解
      • 此方式创建出来的对象,在Spring容器中的名称默认是将类名首字母改为小写
        • 例如:类名是AdminController,则对象在Spring容器中的名称为adminController
        • 此规则仅适用于类名的第1个字母大写,且第2个字母小写的情况,如果不符合此规则,则对象在Spring容器中的名称就是类名
        • 可以通过组件注解的参数来指定名称.
      • 在任何配置类上,添加 @ComponentScan ,当加载此配置类时们就会激活组件扫描
      • 可以配置@ComponentScan的参数,此参数应该是需要被扫描的根包(会扫描所配置的包,及其所有子孙包),且此注解参数的值是数组类型.
        • @CompontenScan("cn.tedu")
    • 如果没有配置@ComponentScan的参数中的根包,则组件扫描的范围就是当前类的根包,及其子孙包.
    • 需要在个组件类上添加组件注解才会被创建对象.常见的主键注解有
      • @Component: 通用注解
      • @Controller :控制器类注解
        1. @RestController:仅添加在Spring MVC框架以后才可以使用
        2. @ControllerAdvice:仅添加在Spring MVC框架以后才可以使用
        3. @RestControllerAdvice:仅添加在Spring MVC框架以后才可以使用
      • @Service :保证数据的完整性,安全性,和有效性,设计业务流程和业务逻辑规则,是Serviect这种业务注解
      • @Repository :处理数据源中的数据读写的类的注解
    • 以上四种组件注解在Spring框架作用范围之内是完全等效的.但是用的时候我们还是要有章法,分开来用.
    • Configuration也是一个组件注解,但是和上面四个是不一样的.Spring对次注解的处理更加的特殊(Spring 框架对配置类使用了代理模式.)
      对于这两种创建对象的做法,通常
    • 如果是自定义的类,优先使用组件扫描的做法来创建对象
    • 如果不是自定义类,无法使用组件扫描的做法,只能在配置类中通过@Bean方法来创建对象
      当Spring成功创建了对象后,会将对象保存在Spring应用程序上下文中,后续,当需要这些对象时,可以从Spring上下文中获取.
      由于Spring应用程序上下文对象中持有大量对象的引用,所以:Spring应用程序上下文也通常称之为Spring 容器

    Spring 框架管理的对象的作用域

    默认情况下,Spring框架管理的对象都是单例
    单列 :在任何时间点,某个类的对象最多只有1个
    可以在类上添加@Scope(“protorype”)使得被Spring管理的对象时"非单列的".

    @Scope注解还可以配置为@Scope("singleton"),此singleton表示“单例的”,是默认的。

    默认情况下,Spring框架管理框架单例是"预加载的",相当于设计模式中的单例模式的"恶汉式单列模式"

    提示可以在类上添加@Lazy注解,使得此读写是"懒加载的",相当于"懒汉式单列模式",只会在第1次需要获取对象时才把对象创建出来!

    注意 Spring框架并不是是用来设计模式中的"单例模式",只是从对象管理方面,对象的作用域表现域单例模式极为相似而已.

    Admin admin=new Admin();
    admin.setUsername("root")
    
    • 1
    • 2

    自动装配

    自动装配的定义:当某个量需要值时,Spring框架会自动从Spring容器中找到合适的值,为这个量赋值.
    自动装配的典型表现是在某个类中添加@Autowired 注解,例如

    @RestController
    public class AlbumController {
    
    // ↓↓↓↓↓↓↓↓↓自动装配的典型表现↓↓↓↓↓↓↓↓↓↓↓
        @Autowired
        private IAlbumService albumService;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    或者:

    @RestController
    public class AlbumController {
        private IAlbumService albumService;
    
    //                    ↓↓↓↓↓↓↓↓↓自动装配↓↓↓↓↓↓↓↓↓↓↓
    public AlbumController(IAlbumService albumService){
       this.albumService=albumService;
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Spring创建对象时候,需要调用构造方法,如果类中仅有一个构造方法,Spring会自动调用,(如上所示),如果这个唯一的构造方法是有参数的,Spring也会自动从容器中找到合适的对象来调用此构造方法,如果容器没有合适的对象,则无法创建,!如果类中有多个构造方法,默认情况下,Spring会自动调用添加了@Autowired注解的构造方法,如果多个构造方法都没有添加此注解,则Spring会自动调用无参的构造方法,如果也不存在无参构造,则会报错.

    或者:

    @RestController
    public class AlbumController {
        private IAlbumService albumService;
    
    @Autowired
    //                        ↓↓↓↓↓↓↓↓↓自动装配↓↓↓↓↓↓↓↓↓↓↓
    public void setAlbumService(IAlbumService albumService){
       this.albumService=albumService;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    另外在配置类中的@Bean方法也是可以在需要的时候自行添加参数,如果Spring容器中有合适的值,Spring也会从容器中找到值来调用对象.
    关于合适的值,Spring对于@Autowired的处理机制是:查找在Spring容器中匹配类型的对象的数量:

    • 1个:直接装配,且装配成功
    • 0个:取决于@Autowired注解的required属性
      • true(默认值):装配失败,加载时报错(即启动项目)
      • false:放弃装配,则此量的值为null,在接下来的使用过程中可能导致NPENullPointerException
    • 超过1个:取决于是否存在某个Spring Bean(Spring容器中的对象)的名称与当前量的名称匹配
      • 存在:成功装配
      • 不存在:转配失败,加载时报错(即启动项目的时候报错)
        关于通过名称匹配失败的问题
    • 默认情况下,要求量(全局变量,方法参数等)的名称与对象在Spring容器中名称完全相同,可视为完全匹配.
    • 可以在量的声明之前添加@Qualifier注解,通过此注解参数来指定名称,以匹配某个Spring容器的对象.
      • @Qualifier注解是用于配合自动转配机制的,单独使用没有意义.
        其实还可以使用@Resource注解来实现自动装配,但是不推荐
        Spring框架对@Resource注解的自动装配机制是:先根据名称再根据类型来实现自动装配,与@Autowired完全相反.
        为什么不推荐用@Resource是javax这个包(官方的)中的注解(儿子),但是@Autowired是Spring的亲儿子,为什么我们明明有官方的亲儿子,Spring还要创建一个呢?@Resource存在一定的不足,,此注解只能添加在类上、属性上、方法上,不可以添加在构造方法上、方法的参数上。

    关于IoC与DI

    **IoC: ** inversion of Control,控制反转,即将对象的创建,管理的权利(控制能力)交个框架
    ID: Dependency Injection ,依赖注入,即为依赖项注入值(例如,controller中有Service,其实就是依赖 而我们的Service有值了那么就是注入.说白了就是赋值,但是没有等号,我们就叫注入,)
    Spring框架通过DI,现实完善了Ioc

    关于Spring AOP

    AOP:面向切面的编程
    ** 注意:** AOP并不是Spring框架特有的技术,只是Spring框架很好地支持了AOP
    AOP:主要用于:日志,安全,事务管理,自定义业务规则(但是我们现在都用来框架来解决这些,但是这些框架底层用了AOP,所有我们写代码后就没有用什么AOP).
    在项目中,数据的处理流程大致是:

    添加品牌:请求--------->Controller -------->Service -------->Mapper ------->DB
               <---------           <---------       <---------      <---------
    
    添加类别:请求--------->Controller -------->Service -------->Mapper ------->DB
               <---------           <---------       <---------      <---------
    
    删除品牌:请求--------->Controller -------->Service -------->Mapper ------->DB
               <---------           <---------       <---------      <---------
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其实,各个请求提交到服务器端后,数据的处理流程是相对固定的!
    假设存在某个需求,无论是添加[]品牌,添加类别,删除品牌,或者其他请求的处理,都需要在Service组件中执行相同的任务,应该如何处理?

    例如,假设需要实现一个功能,“统计所有Service中的业务方法的执行耗时”,首先,需要添加依赖

    <!-- Spring Boot AOP的依赖项 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    则可以在根包下创建一个aop.TimerAspect;类,作为切面类,必须添加@Aspect注解,由于是通过Spring来管理,它应该交由Spring管理,它应该是个组件类,则再补充上@Component注解,并在类中自定义方法,且通过注解来配置方法何时执行:

    package cn.tedu.csmall.product.aop;
    
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Aspect
    @Component
    public class TimerAspect {
    
        public TimerAspect() {
            log.debug("创建切面对象:TimerAspect");
        }
    
        // 【AOP的核心概念】
        // 连接点(JoinPoint):数据处理过程中的某个时间节点,可能是调用了方法,或抛出了异常
        // 切入点(PointCut):选择一个或多个连接点的表达式
        // 通知(Advice):在选择到的连接点执行的代码
        // 切面(Aspect):是包含了切入点和通知的模块
        // ----------------------------------------------------------
        // 【通知注解】
        // @Before注解:表示“在……之前”,且方法应该是无参数的
        // @After注解:表示“在……之后”,无论是否抛出异常,或是否返回结果,都会执行,且方法应该是无参数的
        // @AfterReturning注解:表示“在返回结果之后”,且方法的参数是JoinPoint和返回值
        // @AfterThrowing注解:表示“在抛出异常之后”,且方法的参数是JoinPoint和异常对象
        // @Around注解:表示“包裹”,通常也称之为“环绕”,且方法的参数是ProceedingJoinPoint
        // ----------------------------------------------------------
        // @Around开始
        // try {
        //     @Before
        //     表达式匹配的方法
        //     @AfterReturning
        // } catch (Throwable e) {
        //     @AfterThrowing
        // } finally {
        //     @After
        // }
        // @Around结束
        // ----------------------------------------------------------
        // 注解中的execution内部配置表达式,以匹配上需要哪里执行切面代码
        // 表达式中,星号(*)是通配符,可匹配1次任意内容
        // 表达式中,2个连接的小数点(..)也是通配符,可匹配0~n次,只能用于包名和参数列表
        @Around("execution(* cn.tedu.csmall.product.service.*.*(..))")
        //                 ↑ 此星号表示需要匹配的方法的返回值类型
        //                   ↑ ---------- 根包 ----------- ↑
        //                                                  ↑ 类名
        //                                                    ↑ 方法名
        //                                                      ↑↑ 参数列表
        public Object timer(ProceedingJoinPoint pjp) throws Throwable {
            log.debug("执行了TimeAspect中的方法……");
    
            log.debug("【{}】类型的对象调用了【{}】方法,参数值为【{}】",
                    pjp.getTarget().getClass().getName(),
                    pjp.getSignature().getName(),
                    pjp.getArgs());
    
            long start = System.currentTimeMillis();
            // 注意:必须获取调用此方法的返回值,作为当前切面方法的返回值
            // 注意:必须抛出调用此方法的异常,不可以使用try...catch捕获并处理
            Object result = pjp.proceed(); // 相当于执行了匹配的方法,即业务方法
            long end = System.currentTimeMillis();
    
            log.debug("执行耗时:{}毫秒", end - start);
    
            return result;
        }
    
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    【AOP的核心概念】

    1. 连接点(JoinPoint):数据处理过程中的某个时间节点,可能是调用了方法,或抛出了异常
    2. 切入点(PointCut):选择一个或多个连接点的表达式(注解里面的选择表达式)
    3. 通知(Advice):在选择到的连接点执行的代码(就是上面的注解)
    4. 切面(Aspect):是包含了切入点和通知的模块

    Spring MVC框架

    Spring MVC框架的作用

    Spring MVC 框架主要解决了接收请求,响应结果的相关问题

    Spring MVC框架的依赖项

    当项目中使用Spring MVC框架时,需要添加的依赖项是:spring-webmvc

    配置请求路径

    通过@RequestMapping系列注解可以配置请求路径

    限制请求方式

    通过@RequestMapping注解的method属性限制请求方法,如

    @RequestMapping(value="/login",method=RequestMetho.POST)
    
    • 1

    或者直接使用衍生的注解,例如@GetMapping,@PostMapping

    接受请求参数

    可以在处理请求的方法的参数列表中自由设计请求参数,可以:

    • 将各个请求参数逐一列举出来,表现为方法的多个参数,例如:
    public JsonResult<Void> login(String username,String password){...}
    
    • 1
    • 将各个请求参数封装到自定义类型中,使用自定义类型作为方法参数
      关于请求参数注解
    • @RequestParam:此注解可以用于:**1.**修改请求参数的名称(没有太多的实用价值),2强制要求必须提交这个参数,(可以通过Validation框架的@NotNull实现同样的效果)所有也没有太多价值,3:设置请求参数的默认值,(适用于允许客户端)提交此请求参数时)
    • @PathVariable:当URL中设计了占位符参数时,必须在对应的方法参数上添加此注解,以表示参数的值来自URL中的占位符位置的值,如果占位符中的名称与方法参数名称不匹配,可以通过此注解的参数来配置
      在这里插入图片描述
    • @RequestBody:当方法的参数添加了此注解时,客户端提交的请求参数必须是对象格式的,当方法的参数没有添加此注解时,客户端提交的请求参数必须是FormData格式.

    响应结果

    • 默认情况下,处理请求的方法的返回值将表示"处理响应结果的视图组件的名称,及相关的数据".在Spring MVC中,有一种内置的返回值类型是Model AndView,不是前后端分离的做法,
    • 在处理请求的方法上可以添加一个@ResponseBody注解,当添加此注解后,处理请求的方法的返回值将表示"响应的数据,"不再由服务器端决定视图组件,这种做法也叫做响应正文! 这是前后端分离的做法.
    • @ResponseBody注解可以添加在处理请求的方法上,将作用于当前方法,也可以添加在控制器类上,将作用于控制器类中所有处理请求的方法.!
    • 控制器类需要添加@Controller注解,才是控制器类,或者,也可以改为添加@RestController,此注解是由@Controller@ResponseBody组合而成的,所以,添加@RESTController后,当前控制器类中多有处理请求的方法都是响应正文的.
      当控制器类处理请求需要响应正文时,Spring MVC框架会根据处理请求的方法的放回值类型,来决定使用某个MessageConverter(消息转换器),来将返回值转换为响应到客户端的数据,不同的返回值类型对应不同的消息转换器,例如
      ,返回值是String时,Spring MVC将使用stringHttpMessageConverter,如果某个返回值类型是Spring MVC框架默认不识别的没有对应的消息转换器,且当前项目添加了jackson-databind依赖项后,会自动使用此依赖项中的消息转换器,而jackaon-databind中的消息转换器会将返回的结果转换为JSON格式的字符串.!==所有我们的项目为什么能响应JSON类型的数据,1,是因为我们的类型框架自动不识别,2,是因为我们添加了此框架.==另外,如果此项目是使用XML来配置的SpringMVC框架的,还需要添加以开启注解驱动,如果是使用注解进行配置的,则需要在配置类添加@RnableWebMVC注解,如果在SpringBoot应用SpringMVC,不需要进行配置.
      .

    关于处理异常

    添加了 @ExceptionHandler注解的方法,就是处理异常的方法

    • 处理异常的方法到底处理哪种异常.由@ExceptionHandler注解参数或方法的参数中的异常类型来决定,如果@ExceptionHandler注解没有配置参数,由方法参数中的异常类型决定,如果@ExceptionHandler注解配置了参数,由注解参数中配置的类型为准.
    • 处理异常的方法可以声明在控制器类,将只作用于当前控制器类中的方法抛出的异常
      • 通常,建议将处理异常的方法声明在专门的类中,并在此类上添加@ControllerAdvice注解,当添加此注解后,此类中特定的方法(例如处理异常的方法)将作用于每次处理请求的过程中!如果处理异常后的将"响应正文",也可以在处理异常的方法上添加@ResponseBody注解,或在当前类上添加@ResponseBody,或使用@RestControllerAdvice取代@ControllerAdvice@ResponseBody注解.

    Spring MVC核心处理

    在这里插入图片描述

    Spring Boot框架

    Spring Boot框架的作用

    Spring Boot 框架主要解决了统一管理依赖项与简化配置相关的问题
    统一管理依赖项:在开发实践中,项目中需要用到的依赖项可能较多,在没有SpringBoot之前,可能徐需要自行添加若干个依赖项,并且,需要自行保证这些依赖项的版本不会发生冲突,或保证不存在不兼容的问题.Spring Boot提供了starter依赖项(就是依赖项的名称中都有starter作为关键字),这种依赖项包含了使用某个框架时可能涉及的一系列依赖项,并处理好了各种依赖项的版本相关问题,保证依赖项的版本兼容,不冲突!例如spring-boot-starter-web就包含了Spring MVC的依赖项(Spring-webmvc),jackson-databind,tomcat
    简化配置 Spring Boot默认各个项目中最可预测的配置,它是一种约定大于配置的思想.当然这些配置也都是可以修改的,例如通过在application.properties中添加指定属性名的配置.

    Spring 框架的依赖项

    当项目中使用Spring Boot 框架时,需要添加的基础依赖项是:spring-boot-starter.此基础依赖项被其他各自带有starter字样的依赖项所包含,所以,通常是不必显示的添加此基础依赖项.

    典型的应用技巧

    关于日志
    spring-boot-starter中已经包含spring-boot-starter-logging,所以,在添加任何starter依赖后,在项目中均可使用日志.
    关于配置文件

    • Spring Boot项目默认在src/main/.resources下已经准备好了配置文件,且Spring Boot默认识别的配置文件的文件名是application,其扩展名为.properties.yml
    • 此配置文件会被Spring Boot自动读取,框架指定属性名称的个配置值会被自动应用,自定义的配置需要通过Environment对象或通过@Value注解自行读取并应用,所有不是指定属性名称的配置都是自定义配置.
    • 其实,读取.properties配置文件是Spring框架能做到的功能,而.ym 配置是Spring 框架并不支持的,但是在Spring Boot中,添加了解析 .yml文件的依赖项,所以,在Spring Boot 中既可以使用.properties也可以使用.yml.
    • 另外,Spring Boot 还很好的支持了Profile配置(也是Spring框架做到的功能)

    注解

    注解所属框架添加位置和作用
    @ComponentScanSpring添加在配置类上,开启组件扫描。
    如果没有配置包名,则扫描当前配置类所在的包,
    如果配置了包名,则扫描所配置的包及其子孙包
    @ComponentSpring添加在类上,标记当前类是组件类,可以通过参数配置Spring Bean名称
    @ControllerSprign添加在类上,标记当前类是控制器组件类,用法同@Component
    @Service Spring添加在类上,标记当前类是业务逻辑组件类,用法同@Component
    @Repository Spring添加在类上,标记当前类是数据访问组件类,用法同@Component
    @Configuration Spring添加在类上,仅添加此注解的类才被视为配置类,通常不配置注解参数
    @BeanSpring添加在方法上,标记此方法将返回某个类型的对象,
    且Spring会自动调用此方法,并将对象保存在Spring容器中
    @AutowiredSpring添加在属性上,使得Spring自动装配此属性的值
    添加在构造方法上,使得Spring自动调用此构造方法
    添加在Setter方法上,使得Spring自动调用此方法
    @QualifierSpring添加在属性上,或添加在方法的参数上,
    配合自动装配机制,用于指定需要装配的Spring Bean的名称
    @ScopeSpring添加在组件类上,或添加在已经添加了@Bean注解的方法上,
    用于指定作用域,注解参数为singleton(默认)时为“单例”
    注解参数为prototype时为“非单例”
    @LazySpring添加在组件类上,或添加在已经添加了@Bean注解的方法上,
    用于指定作用域,当Spring Bean是单例时,
    注解参数为true(默认)时为“懒加载”,注解参数为false时为“预加载”
    @ValueSpring添加在属性上,或添加在被Spring调用的方法的参数上,用于读取Environment中的属性值,为对象的属性或方法的参数注入值
    @ResourceSpring此注解是javax包中的注解,
    添加在属性上,使得Spring自动装配此属性的值,
    通常不推荐使用此注解
    @ResponseBodySpring MVC添加在方法上,标记此方法是“响应正文”的,
    添加在类上,标记此类中所有方法都是“响应正文”的
    @RestControllerSpring MVC添加在类上,标记此类是一个“响应正文”的控制器类
    @RequestMappingSpring MVC添加在类上,也可以添加在处理请求的方法上,
    通常用于配置请求路径
    @GetMappingSpring MVC添加在方法上,是将请求方式限制为GET的@RequestMapping
    @PostMappingSpring MVC添加在方法上,是将请求方式限制为POST的@RequestMapping
    @DeleteMappingSpring MVC添加在方法上,是将请求方式限制为DELETE的@RequestMapping
    @PutMapping Spring MVC添加在方法上,是将请求方式限制为PUT的@RequestMapping
    @RequestParamSpring MVC添加在请求参数上,可以:
    1. 指定请求参数名称
    2. 要求必须提交此参数
    3. 指定请求参数的默认值
    @PathVariableSpring MVC添加在请求参数上,用于标记此参数的值来自URL中的占位符,如果URL中的占位符名称与方法的参数名称不同,需要配置此注解参数来指定URL中的占位符名称
    @RequestBodySpring MVC添加在请求参数上,用于标记此参数必须是对象格式的参数,如果未添加此注解,参数必须是FormData格式的
    @ExceptionHandlerSpring MVC添加在方法上,标记此方法是处理异常的方法,可以通过配置注解参数来指定需要处理的异常类型,如果没有配置注解参数,所处理的异常类型取决于方法的参数列表中的异常类型
    @ControllerAdviceSpring MVC添加在类上,标记此类中特定的方法将作用于每次处理请求的过程中
    @RestControllerAdviceSpring MVC添加在类上,是@ControllerAdvice@ResponseBody的组合注解
    @MapperScanMybatis添加在配置类上,用于指定Mapper接口的根包,Mybatis将根据此根包执行扫描,以找到各Mapper接口
    @MapperMybatis添加在Mapper接口上,用于标记此接口是Mybatis的Mapper接口,如果已经通过@MapperScan配置能够找到此接口,则不需要使用此注解
    @ParamMybatis添加在Mapper接口中的抽象方法的参数上,用于指定参数名称,当使用此注解指定参数名称后,SQL中的#{} / ${}占位符中的名称必须是此注解指定的名称,通常,当抽象方法的参数超过1个时,强烈建议在每个参数上使用此注解配置名称
    @SelectMybatis添加在Mapper接口的抽象方法上,可以通过此注解直接配置此抽象方法对应的SQL语句(不必将SQL语句配置在XML文件中),用于配置SELECT类的SQL语句,但是,非常不推荐这种做法
    @InsertMybatis同上,用于配置INSERT类的SQL语句
    @UpdateMybatis同上,用于配置UPDATE类的SQL语句
    @DeleteMybatis同上,用于配置DELETE类的SQL语句
    @Transactional Spring JDBC推荐添加的业务接口上,用于标记此接口中所有方法都是事务性的,或业务接口中的抽象方法上,用于此方法是事务性的
    @SpringBootApplicationSpring Boot添加在类上,用于标记此类是Spring Boot的启动类,每个Spring Boot项目应该只有1个类添加了此注解
    @SpringBootConfigurationSpring Boot通常不需要显式的使用,它是@SpringBootApplication的元注解之一
    @SpringBootTestSpring Boot添加在类上,用于标记此类是加载Spring环境的测试类
    @ValidSpring Validation添加在方法的参数上,标记此参数需要经过Validation框架的检查
    @ValidatedSpring Validation添加在方法的参数上,标记此参数需要经过Validation框架的检查;添加在类上,并结合方法上的检查注解(例如@NotNull等)实现对未封装的参数的检查
    @NotNull Spring Validation添加在需要被检查的参数上,或添加在需要被检查的封装类型的属性上,用于配置“不允许为null”的检查规则
    @NotEmptySpring Validation使用位置同@NotNull,用于配置“不允许为空字符串”的检查规则
    @NotBlank SpringValidation使用位置同@NotNull,用于配置“不允许为空白”的检查规则
    @PatternSpring Validation使用位置同@NotNull,用于配置正则表达式的检查规则
    @RangeSpring Validation使用位置同@NotNull,用于配置“数值必须在某个取值区间”的检查规则
    @Api Knife4j添加在控制器类上,通过此注解的tags属性配置API文档中的模块名称
    @ApiOperation Knife4j添加在控制器类中处理请求的方法上,用于配置业务名称
    @ApiOperationSupportKnife4j添加在控制器类中处理请求的方法上,通过此注解的order属性配置业务显示在API文档中时的排序序号
    @ApiModelProperty Knife4j添加在封装的请求参数类型中的属性上,用于配置请求参数的详细说明,包括:名称、数据类型、是否必须等
    @ApiImplicitParam Knife4j添加在控制器类中处理请求的方法上,用于配置请求参数的详细说明,包括:名称、数据类型、是否必须等
    @ApiImplicitParamsKnife4j添加在控制器类中处理请求的方法上,如果需要通过@ApiImplicitParam注解配置的参数超过1个,则必须将多个@ApiImplicitParam注解作为此注解的参数
    @ApiIgnoreKnife4j添加在请求参数上,用于标记API文档中将不关心此参数
    @EnableGlobalMethodSecuritySpring Security添加在配置类上,用于开启全局的方法级别的权限控制
    @PreAuthorizeSpring Security添加在方法上,用于配置权限
    @AuthenticationPrincipalSpring Security添加在方法的参数上,且此参数应该是Security上下文中的认证信息中的当事人类型,用于为此参数注入值
    @DataLombok添加在类上,将在编译期生成此类中所有属性的SetterGetter方法,及hashCode()equals()toString()方法
    @Setter Lombok添加在类上,将在编译期生成此类中所有属性的Setter方法,也可以添加在类的属性上,将在编译期生成此属性的Setter方法
    @Getter Lombok添加在类上,将在编译期生成此类中所有属性的Getter方法,也可以添加在类的属性上,将在编译期生成此属性的Getter方法
    @EqualsAndHashcodeLombok添加在类上,将在编译期生成基于此类中所有属性的hashCode()equals()方法
    @ToStringLombok添加在类上,将在编译期生成基于此类中所有属性的toString()方法
    @NoArgConstructorLombok添加在类上,将在编译期生成此类的无参数构造方法
    @AllArgsConstructorLombok添加在类上,将在编译期生成基于此类中所有属性的全参构造方法
  • 相关阅读:
    c++ linux 配置
    Selenium基础 — Selenium元素定位(一)
    leetcode 20.有效括号 栈的简单应用
    layui子界面操作数据后主界面刷新怎么操作
    【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)
    一起学docker系列之四docker的常用命令--系统操作docker命令及镜像命令
    案例分享:原生广告如何助力app实现高效变现收益的转化
    jquery.i18n.properties.js使用及seo优化
    惠普服务器硬盘指示灯不亮或显示蓝色
    从0搭建Vue3组件库(七):使用 glup 打包组件库并实现按需加载
  • 原文地址:https://blog.csdn.net/weixin_51599093/article/details/127788481