springboot常用注解

时间:2021-07-12
本文章向大家介绍springboot常用注解,主要包括springboot常用注解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

注解分类

从广义上Spring注解可以分为两类:

一类注解是用于注册Bean

假如IOC容器就是一间空屋子,首先这间空屋子啥都没有,我们要吃大餐,我们就要从外部搬运食材和餐具进来。这里把某一样食材或者某一样餐具搬进空屋子的操作就相当于每个注册Bean的注解作用类似。注册Bean的注解作用就是往IOC容器中放(注册)东西!
用于注册Bean的注解: 比如@Component、@Repository、@Controller、@Service、@Configration这些注解就是用于注册Bean,放进IOC容器中,一来交给spring管理方便解耦,二来还可以进行二次使用,啥是二次使用呢?这里的二次使用可以理解为:在你开始从外部搬运食材和餐具进空屋子的时候,一次性搬运了猪肉、羊肉、铁勺、筷子四样东西,这个时候你要开始吃大餐,首先你吃东西的时候肯定要用筷子或者铁勺,别说你手抓,只要你需要,你就会去找,这个时候发现你已经把筷子或者铁勺放进了屋子,你就不用再去外部拿筷子进屋子了,意思就是IOC容器中已经存在,就可以只要拿去用,而不必再去注册!而拿屋子里已有的东西的操作就是下面要讲的用于使用Bean的注解!

一类注解是用于使用Bean

用于使用Bean的注解:比如@Autowired , @Resource注解,这些注解就是把屋子里的东西自己拿来用,如果你要拿,前提一定是屋子(IOC)里有的,不然就会报错,比如你要做一道牛肉拼盘需要五头牛做原材料才行,你现在锅里只有四头牛,这个时候你知道,自己往屋子里搬过五头牛,这个时候就直接把屋子里的那头牛直接放进锅里,完成牛肉拼盘的组装。是的这些注解就是需要啥想要啥,只要容器中有就往容器中拿!而这些注解又有各自的区别,比如@Autowired用在筷子上,这筷子你可能只想用木质的,或许只想用铁质的,@Autowired作用在什么属性的筷子就那什么筷子,而@Resource如果用在安格斯牛肉上面,就指定要名字就是安格斯牛肉的牛肉。

@bean注解

@Component@Repository@Controller@Service这些注解只局限于自己编写的类,而@Bean注解和@Import能把第三方库中的类实例加入IOC容器中并交给spring管理

Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。 产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。@Bean明确地指示了一种方法,什么方法呢?产生一个bean的方法,并且交给Spring容器管理;从这我们就明白了为啥@Bean是放在方法的注释上了,因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就别管了。@Bean就放在方法上,就是让方法去产生一个Bean,然后交给Spring容器。

@Configuration
public class MyConfig {
    
    @Bean
    public User user() {
        User user = new User();
        user.setCat(cat());
        return user;
    }

    @Bean
    public Cat cat() {
       return new Cat();
    }
    
}

@Configuration注解

用于定义配置类,替换xml文件,通常搭配@Bean使用

spring5.2之后新增lite模式Full模式和Lite模式是针对spring配置而言的,和xml配置无关。

Lite模式:

  • 类上有@Component注解
  • 类上有@ComponentScan注解
  • 类上有@Import注解
  • 类上有@ImportResource注解
  • 类上没有任何注解,但是类中存在@Bean方法
  • 类上有@Configuration(proxyBeanMethods = false)注解

Lite总结:运行时不用生成CGLIB子类,提高运行性能,降低启动时间,可以作为普通类使用。但是不能声明@Bean之间的依赖

Full模式:

  • 标注有@Configuration或者@Configuration(proxyBeanMethods = true)的类被称为Full模式的配置类

Full模式总结:单例模式能有效避免Lite模式下的错误。性能没有Lite模式好

上面的代码中user组件依赖了cat组件,此时@Configuration(proxyBeanMethods = true)

@Import注解

@import(User.class,Cat.class,MyImportSelector.class): 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

public class MyImportSelector implements ImportSelector {

    /**
     * 可以返回空数组,返回null会报空指针异常
     *
     * @param importingClassMetadata:当前标注@Import注解的所有注解信息
     * @return 返回值就是要导入容器组件的全类名
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.jay.pojo.Blue","com.jay.pojo.Red"};
    }
}

@Conditional注解

按照条件装配,满足Conditional指定的条件,则进行组件注入,可以作用在类上和方法上,下图是改注解的衍生子类注解

@Configuration
@Import({MyImportSelector.class})
//表示当前spring容器中有cat时,在把该bean加到spring容器里面
@ConditionalOnBean(Cat.class)
public class MyConfig {
    @Bean
    public User user() {
        return new User();
    }
}

@ConfigurationProperties注解

配置绑定:读取配置文件中的内容

user:
  name: "zhangsan"
  age: 18
  cat:
    name: "tomcat"
    age: 3

@EnableConfigurationProperties(User.class)

  • 开启User属性绑定功能
  • 把User组件自动注册在spring容器中
@Configuration
@EnableConfigurationProperties(User.class)
public class MyConfig {
   
}

@ConfigurationProperties(prefix = "user")

@ConfigurationProperties(prefix = "user")
public class User {
    private String name;
    private Integer age;
    private Cat cat;
}

原文地址:https://www.cnblogs.com/kaimuxin/p/15004400.html