• spring boot常用注解


    启动注解

    @SpringBootApplication

    相当于 @Configuration、@EnableAutoConfiguration 、 @ComponentScan 三个的作用

    扫描包注解

    @ComponentScan

    1、工程中Application类的位置。默认情况下就不需要配置@ComponentScan这个注解了。 因为Application类,在启动的时候,默认是加载和Application类所在同一个目录下的所有类,包括所有子目录下的类。所以一般情况下,启动类的位置是有特殊要求的。 必须放在所有包的根目录中。

    2、假设写的模块,编译成了jar包,并且上传到了私服。在pom中以第三方包的形式依赖进来。
    如果jar包中也存在注解,为了spring boot启动的时候,注解可以被扫描到,需要做的就是
    在spring boot启动类中配置上 @ComponentScan注解,并且指定第三方jar包的根路径。
    所以一般情况下,公司级的第三包前面的路径名最好一直。比方说 com.pa 这样就不会出现遗漏的情况。

    3、还有一个说法是,第三方包中最好不要使用注解,因为注解会带来调用者使用不方便,需要配置扫描注解等。如果遗漏指定包扫描路径,那么就会出bean加载失败的情况。所以我们看到的最基础的第三方jar包,几乎是没有注解的。

    @Configuration、@Bean

    1、表示这个类是一个spring 配置类,一般这里面会定义Bean,会把这个类中bean加载到spring容器中。

    2、2、可以与@Conditional相关的注解联合使用来实现@Configuration修饰类的条件加载

    @EnableAutoConfiguration

    如果被依赖包中在src/main/resource/META-INF中定义了spring.factories文件,并且在文件中定义了org.springframework.boot.autoconfigure.EnableAutoConfiguration属性,属性内定义了多个完整的类路径。springboot中的自动加载机制就是通过这种方式出现的。

     工作原理:https://www.jianshu.com/p/464d04c36fb1

    在依赖包中使用了@EnableAutoConfiguration注解,那么该注解就会去他所有pom的依赖项中逐项扫描其内部是否包含该文件,并且会自动加载内部定义的所有类。而springboot自身的所有对象都是通过该种方式来实现创建的。

    @ComponentScan和@EnableAutoConfiguration区别

    1、对于@Configuration和@Conditional联合定义的类,如果出现了@Configuration类的嵌套,那么外面的@Conditional起作用的范围是不一样的。@EnableAutoConfiguration是都起作用,但是@ComponentScan只对外面的起作用,里面还是照样会执行到,要特别注意。

    http://www.cnblogs.com/diegodu/p/7889379.html

    范围类注解

    @Scope

    https://blog.csdn.net/zalan01408980/article/details/82904126

     创建bean对象

    @Component

    无差别的bean对象,下面的注解其实都是在该注解的基础上实现的,用于表示特殊用途的bean对象。

    @Controller和@RestController

    外部访问请求对象,其中@Controller默认返回的视图,而@RestController默认返回的是字符串。 @RestController是在@Controller基础上定义加上@ResponseBody实现的。

    请求相关的注解还有下面这些

    @service

    表示服务类的bean对象

    @repository

    表示存储类的bean对象

     

    对象注入

    @Resource与@Autowired

    1、共同点

    两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

    2、不同点

    (1)@Autowired

    @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

    @Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

    (2)@Resource

    @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

    所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

    注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

    @Resource装配顺序:

    ①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

    ②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

    ③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

    ④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

    @Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

    web请求类

    @RequestMapping

    该注解通常与@RestController搭配使用,使用该注解可以定义请求路径,既可以指定多个路径,也可以使用通配符定义路径。也可以在路径中使用占位符。也可以限制请求的方式和参数。

    https://blog.csdn.net/zalan01408980/article/details/82904126

    @GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping

    这些注解都是继承了@RequestMapping,限制了指定请求方式的注解。只用于修饰方法。

    @FeignClient

    springcloud中提供的web请求注解,该注解用于修饰一个接口,可以指定请求的根路径,请求名。与@GetMapping等上面的方法注解搭配使用。只需要定义接口,不用实现就可以发送HTTP客户端请求。

    Conditional 条件加载相关类和注解

    Condition接口

    public interface Condition {
        boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
    }

    Condition是个接口,需要实现matches方法,返回true则注入bean,false则不注入。
    https://blog.csdn.net/xcy1193068639/article/details/81491071

    @Conditional

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。

    @Conditional的定义:

    //此注解可以标注在类和方法上
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Conditional {
    Class<? extends Condition>[] value();
    }
    从代码中可以看到,需要传入一个Class数组,并且需要继承Condition接口:

    其他条件类注解

    Spring框架还提供了很多@Condition给我们用,当然总结用语哪种好理解,看给位读者喽

    @ConditionalOnProPerty:定义某个指定参数是否满足设定值,满足就加载,不满足就不加载

    https://blog.csdn.net/u010002184/article/details/79353696

    @ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
    @ConditionalOnClass(指定class位于类路径上,才会实例化一个Bean)
    @ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
    @ConditionalOnMissingBean(仅仅在当前上下文中不存在指定名字的bean对象时,才会实例化一个Bean)
    @ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
    @ConditionalOnNotWebApplication(不是web应用)

    
    
  • 相关阅读:
    HashMap和Hashtable的区别
    装箱以及拆箱
    泛型
    LinkedList和ArrayList异同
    ArrayList的输出方式以及ArrayList的因子增长数
    limit的优化
    mysql五大数据引擎的分别
    ios
    css3(1)
    php
  • 原文地址:https://www.cnblogs.com/suntp/p/9204163.html
Copyright © 2020-2023  润新知