SpringBoot中的常用注解

388 阅读3分钟

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」。

前言

在使用 SpringBoot 开发时,我们已经习惯了使用注解去引入依赖,但是其实很多注解的功能是一样的,所以在合适的地方使用合适的注解,可以提高代码的可读性,帮助我们更好的理解项目结构。

常用注解

1. @Component、@Controller、@Service、@Repository 的区别

一句话,除了名字不同,作用完全等价。@Controller@Service@Repository 就相当于三件衣服,穿衣服的人就是 @Component 源码 image.png

这几个注解的本质都是一样的,往容器中添加 bean,之所以准备这么多套衣服,是为了帮助我们更好的划分代码结构。@Controller 控制层类,@Service 业务层类,@Repository 持久层类,@Component 无法归类到前 3 种时就称为组件。

2. @ComponentScan、@Import

@ComponentScan

@ComponentScan 指定包扫描 等同于原先的 <context:component-scan> , 当我们加上 @ComponentScan(value = "com.xxx.xxx") 时会扫描该路径下的所有组件配置类。

  • basePackagesvalue:  用于指定包的路径,进行扫描
  • basePackageClasses: 用于指定某个类的包的路径进行扫描
  • nameGenerator: bean 的名称的生成器
  • useDefaultFilters: 是否开启对 @Component@Repository@Service@Controller 的类进行检测
  • includeFilters: 包含的过滤条件
    • FilterType.ANNOTATION:按照注解过滤
    • FilterType.ASSIGNABLE_TYPE:按照给定的类型
    • FilterType.ASPECTJ:使用 ASPECTJ 表达式
    • FilterType.REGEX:正则
    • FilterType.CUSTOM:自定义规则
    • excludeFilters: 排除的过滤条件,用法和 includeFilters 一样

@Import

和组件配合使用,给容器中导入我们指定的类型的 bean

@Import({User.class, DBHelper.class})

当加上这个注解,会调用指定类的无参构造器,创建出对于的实例对象,注入到容器中。

3. @Conditional

这个注解的作用是按条件装配,当满足 Conditional 指定的条件时,才会进行组件注入。 Ctrl + H 打开打开继承树 image.png 这是一组注解,满足对应得条件,才会进行组件注入,比如一下几个:

  • @ConditionalOnBean: 当容器中存在指定 bean 时才会做下面的操作
  • @ConditionalOnMissingBean: 当容器中不存在指定 bean 时才会做下面的操作
  • @ConditionalOnClass: 当容器中存在指定类时,执行操作
  • @ConditionalOnMissingClass: 当容器中不存在指定类时,执行操作

这里就不一一列举了,等到使用得时候再详细了解。

4. @ImportResource

@ImportResource(value = "classpath:bean.xml") 在配置类上加上该注解,相当于将类路径下 bean.xml 配置文件里得信息重新解析,放到容器里。

5. @ConfigurationProperties

当类加上这个注解,属性的值会从配置文件中加载,比如 @ConfigurationProperties(prefix = "user") 会在配置文件中找到前缀为user 的配置,后面的属性一一对应上。
注意

  • 只有这个类是容器中的组件,该注解才会生效,所以一般会和 @Component 一起出现。
  • 避免使用关键字,比如,如果你使用 user , Sprig 会优先取系统的环境变量值,这时你会发现你配置的没有生效。
  • 前缀不支持驼峰式命名 MyUser
@Component
@ConfigurationProperties(prefix = "myuser")
public class MyUser {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "MyUser{" +
                "name='" + name + ''' +
                ", age='" + age + ''' +
                '}';
    }
}

application.yml

myuser:
    name: zahngsan
    age: 12

获取 bean 打印输出

MyUser{name='zhangsan', age='12'}

6. @EnableConfigurationProperties

将指定的类注入到容器中,使配置了 @ConfigurationProperties 注解的类完成属性绑定。如果一个配置类只配置 @ConfigurationProperties 注解,而没有使用 @Component ,那么在IOC容器中是获取不到 properties 配置文件转化的 bean