• spring 全家桶常用注解


    目录

    spring中的常用注解

    事务的注解

    注解扫描与配置类

    依赖注入

    spring mvc中的注解

    mapping

    rest风格

    统一异常处理

    参数处理

    ajax

    SpringBoot中常见的注解

    Properties

    condition

    auto

    @configuration

    @Import

    DeferredImportsSelector--- 自动装配的一个关键

    springBoot中的自动装配


    spring中的常用注解

    事务的注解

    • @EnableTransactionManagement 启用声明式事务

    • @Transactional

    @Order注解:用来控制这个bean的优先级,数越小优先级越高,最低优先级为取最大整型时。

    注解扫描与配置类

    • @controller

    • @service

    • @repository

    • @ComponentScan 组件扫描,把bean加载到容器

    • @Conditional 在扫描组件的时候,把符合条件的bean注入容器

    • @Configuration 表明该类为一个配置类

    • @bean 把方法的返回值声明为一个bean

    • @Import 导入其他的类或者是其他的selector

    • @Lazy 标注在类上表示该类为懒加载, 标注在方法参数和成员变量上可以解决循环依赖,会推出一个代理对象来解决循环依赖,最后你在使用这个bean的时候才会把完全化的bean给你。

    依赖注入

    • @autowire 加在方法或者是成员变量

    • @qualifier 同一类型的bean有多个,可以通过这个@qualifier来使用标识name对它们进行区分

    • @value 对配置文件中的值注入到Java对象中

    spring mvc中的注解

    mapping

    • @RequestMapping : 建立请求路径跟控制器之间的方法映射关系,请求路径会和RequestMapping中的路径进行匹配,匹配上了就可以知道由那个RequestMapping对应的方法来处理这个请求。 该注解可以加在类上和方法上。

    • @GetMapping :rest full请求风格,获取指定的资源

    • @PutMapping:rest full请求风格,修改指定的资源

    • @DeleteMapping:rest full请求风格,删除指定的资源

    • @PostMapping:rest full请求风格,增加资源

    rest风格

    rest:rest风格推荐使用json格式的数据来作为数据的交换。

    • @RequestBody :处理请求体中的json数据,把请求体中的json数据转换为Java对象。

    • @ResponseBody :把控制器返回的Java对象解析为json数据,然后写入响应体(不走试图解析层)。

    • @RestController :controller和ResponseBody注解的组合

    • @ResponseStatus:可以控制响应的状态码

    统一异常处理

    • @ControllerAdvice : 统一异常处理方法和转换器都可以放在这个@ControllerAdvice注解的类中。

    • @ExceptionHandler:在一个方法上标注该注解,使用该注解标注的方法可以放在普通类中(如果放在一个单独的控制器中那就可以看作是一个局部的异常处理器,如果是放在标注了@ControllerAdvice 的类中,那就相当于一个全局的异常处理器),经常与@ControllerAdvice经常组合使用来处理全局异常。

    参数处理

    • @PathVariable:从请求路径中获取参数。

      使用场景:通过 @PathVariable 可以将 URL 中【占位符】参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable("xxx") 绑定到操作方法的入参中。

    1. 案例:前端通过post发的请求地址:http://localhost:8080/dish/status/1?ids=1516568538387079169
    2. //后端接口接收参数的形式
    3. @PostMapping("/status/{status}") //前端请求的 status=1通过PathVariable注解被绑定到参数status中,而ids是使用key-value的形式进行传值的,所以可以直接在方法的参数中使用@RequestParam来接收,但是只要你的参数和前端的参数名可以对应,那么就可以默认的走RequestParam 这个注解来获取参数。
    4. public R status(@PathVariable("status") Integer status,Long ids){
    5. log.info("status:{}",status);
    6. log.info("ids:{}",ids);
    7. return null;
    8. }
    • @RequestParam :可以为参数设置默认值;这个注解是默认使用的,只要你的参数和前端的参数名可以对应,那么就可以默认的走这个注解来获取参数。该注解是从请求地址中取值,但是要求前端发的请求参数必须是使用key-value的形式来传递参数的 。 比如xxxxxx/delete?id=2&name= xiaoming

    1. @GetMapping("/tset")
    2. public String setupForm(@RequestParam("petId") int petIdxx, Model model) {
    3. // @RequestParam("petId") int petId 表示前端传过来的petId数据赋值给 petIdxx 属性
    4. }

    默认情况下,使用此注解的方法参数是必需要提供的,但我们可以通过将@RequestParam注解的【required标志设置】为 false来指定方法参数是可选的,就是我使用注解标记了这个属性,但是前端没有传这个数据过来,所以把这个设置为false就不会报错,如果不设置required为false,那么就会报400异常

    ajax

    • @CrossOrigin :可以解决ajax的跨域问题,原理是往响应头上加一些特殊的响应头,允许ajax进行跨域请求,在B/S中没有这种跨域问题,在JavaScript中使用ajax进行请求的时候回出现跨域问题。

    SpringBoot中常见的注解

    Properties

    • @EnableConfigurationProperties:启用@ConfigurationProperties的功能

    • @ConfigurationProperties:把properties中的键值信息与Java bean中的成员属性进行绑定(建议Java对象的属性名和配置文件中的键值对名称一直),可以简化bean的初始化。

    condition

    • @ConditionOnClass:当类路径下包含某个类的时候这个条件才会成立,才会执行后面的bean的创建。

    • @ConditionOnMissingBean:类路径缺失某个类才会条件成立,如果此时spring容器中又需要这个bean但是是缺失的,那么就会走spring 的一些默认配置,是通过bean的name来进行匹配的。

    • @ConditionOnProperty:看properties中有没有我们期望的键值信息,有的话就成立。

    auto

    • @SpringBootApplication:由三个核心注解组合而成,分别是@SpringBootConfiguration(仅仅说明这个是一个spring boot的配置类),@EnableAutoConfiguration(主要去找到自动配置类,然后把自动配置类相关联的bean加载到容器),@ComponentScan(对包进行扫描,这个扫描的过程我们可以自己配置扫描的过滤器,帮助我们排除一些包的扫描)

    • @SpringAutoConfiguration:自动装配

    • @SpringBootConfiguration:说明这个是一个spring boot的配置类

    • spring boot的自动装配后面会说,这里就先不展开说了。

    @configuration

    补充:@configuration的作用

    • 配置类实际上就相当于一个工厂,配置类中标注@bean注解的方法相当于一个工厂方法

    • 配置类中的@bean不支持重载,如果有多个重载方法都加了@bean这个注解,那么仅有一个能入选工厂方法

    • @configuration默认会为标注的类生成代理(可以使用proxyBeanMethods = false 来关闭这个代理),其目的是保证@bean方法相互调用时,仍然能保证其单例特性

    在使用@configuration进行依赖注入的时候需要注意的地方:

    • 后置处理器尽量写成静态方法,不然会导致配置类被提前加载从而导致获取的值为null

    • 或者是说,能使用局部变量做的事情就不要使用成员变量来完成了,可以避免配置类被提前加载

    @Import

    @Import注解:把一些类型注入到容器中

    用法:

    • 一般都是加在配置类上,可以把相关的bean引入到容器中(引入单个类)

    1. @Cofiguration
    2. @Import(A.class)
    3. static class MyCofig(){
    4. }
    • 引入一个配置类:可以把配置类以及配置类中的bean全部加载到容器中去。

    • 定义一个实现ImportSelector 的类,然后重写 selectImports方法,返回的字符串数组中就可以放要引入的bean的name,注意这个name是bean的全限定名称(可以通过 XXX.class.getName()来获取),然后再再配置类使用@Import导入刚刚实现了ImportSelector 的类,只会把字符串数组返回的bean加入到容器,并不会把实现ImportSelector 的类加入到容器。

    DeferredImportsSelector--- 自动装配的一个关键

    DeferredImportsSelector接口:(spring boot中的自动装配中的import的类一般都是要实现DeferredImportsSelector这个接口,目的就是把主配置类的加载放到最初,主配置处理完了才来使用这个从属配置中定义的配置,因为从属配置的优先级应该是要比主配置的优先级低的)

    如果不同的配置类中有同名的bean,并且这两个配置类都是注入同一个容器,那么这个同名的bean会进行什么样的覆盖处理?

    • 同名定义下,默认后面解析的会覆盖前面解析的,如果不想要进行覆盖,可以手动关闭这个覆盖设置(关闭这个覆盖规则后,如果不进行其他的配置仍然在同一个容器中注册同名的bean,那么后台就会直接抛出异常)

    1. //1.先拿到容器对象
    2. //2.再从容器中拿到默认配置的beanFactory
    3. //3.使用拿到的beanFactory.setAllowBeanDefinitionOverriding(false);

    如果我们既想关闭这个默认的覆盖配置又想要我们的主配置生效 ,那么应该怎么办?

    可以写一个类A实现DeferredImportsSelector接口,重写里面的selectImports方法,然后再返回的字符串数组中把从配置的的全限定类名放到这个返回的数组,再就是把这个类A使用import主配置,这样这个配置类的加载过程就变成了:

    主配置类 ---> 加载import导入的A ---> 加载A中返回的从配置 

    也就是把从配置的加载的优先级减低了,如果先加载的主配置中有bean1,而从配置中也有bean1,那么此时只会加载主配置中的bean1,从配置的bean1不会再进行加载了

     

    springBoot中的自动装配

    核心的注解是@SpringBootApplication,它由三个核心注解组合而成,分别是@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。

    • @SpringBootConfiguration:仅仅说明这个是一个spring boot的配置类,和普通的configuration注解功能大致差不多,不同的是@SpringBootApplication对应的应用程序只能有一个,而configuration对应的应用程序可以有多个。

    • @EnableAutoConfiguration:由两个注解组成:@AutoConfigurationPackage(记录该注解所标注的类所在的包)和@import注解组成,主要去找到自动配置类,然后把自动配置类相关联的bean加载到容器。 

    DeferredImportsSelector是把从配置的加载的优先级减低了,如果先加载的主配置中有bean1了,而从配置中也有bean1,那么此时只会加载主配置中的bean1,从配置的bean1不会再进行加载了。(这就是自动装配的关键,你有我就不进行覆盖,你没有但是后面又需要那就使用我的默认配置,默认自动配置类的路径存放在:METE-INF/spring.factories)

    @EnableAutoConfiguration ---> @import ---> AutoConfigurationImportSelector(读取METE-INF/spring.factories下的配置项) ---> DeferredImportsSelector

    • @ComponentScan:对包进行扫描,这个扫描的过程我们可以自己配置扫描的过滤器(通过该注解的excludFilters属性来完成过滤,可以指定自定义的过滤器;而该注解还有另一个过滤器:AutoConfigurationExcluderFilter.class,这个过滤器类是为了排除扫描的时候扫描到了自动装配的包),帮助我们排除一些包的扫描。

     

  • 相关阅读:
    2种方法,jmeter用一个正则提取器提取多个值!
    Linux网络通信(TCP套接字编写,多进程多线程版本)
    【408数据结构与算法】—单链表(五)
    进军东南亚市场,腾讯云数据库 TDSQL 助力印尼 BNC 银行数字化转型
    Scrapy 常用方法以及其补充
    java八股文易错点(持续更新......)
    java源码用到的设计模式
    计算机视觉中的对象跟踪(完整指南)
    第 04 章_逻辑架构
    软件测试/测试开发/人工智能丨聊聊AutoGPT那些事儿
  • 原文地址:https://blog.csdn.net/weixin_53142722/article/details/125945929