Spring和Springboot常见注解

简介: Spring和Springboot常见注解

本文主要介绍Spring和Springboot的常用注解。

一、Spring常用注解

  • @Autowired、@Qualifier

@Autowired是注入依赖的注解,是按照byType的方式进行注入,作用是将配置好的bean拿来用,可用于构造器、属性和setter方法。

@Qualifier的用途是当上下文中有多个bean时,可以用@Qualifier(“name”)来指定特定的bean。

  • @Resource(name=“name”)

@Resource也是注入依赖的注解,他是按照byName的方式进行注入的。

  • @ComponentScan、@Component、@Controller、@Service、@Repository

@ComponentScan是进行组件扫描的注解,他会对标识了@Controller、@Service、@Repository这类进行扫描加载到IoC容器中。

@ComponentScan(value = "com.abacus.check.api")
public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

@Component可以当做@Controller、@Service、@Repository的父类,其中@Controller加载控制器类上,@Service加在服务层类上,@Repository加在DAO层类上。

//@Controller 注解的源码实现
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}
  • @Configuration、@Bean

Spring中为了减少xml中配置,引入了@Configuration和@Bean注解类。@Configuration注解的类,等价于XML中配置beans,表明这个类是beans定义的源。

@Bean注解的方法等价于XML中配置的bean,该方法创建出的实例由Ioc容器管理。

@Configuration
public class TaskAutoConfiguration {
    @Bean
    @Profile("biz-electrfence-controller")
    public BizElectrfenceControllerJob bizElectrfenceControllerJob() {
        return new BizElectrfenceControllerJob();
    }
    @Bean
    @Profile("biz-consume-1-datasync")
    public BizBikeElectrFenceTradeSyncJob bizBikeElectrFenceTradeSyncJob() {
        return new BizBikeElectrFenceTradeSyncJob();
    }
}
  • @Import、@ImportResource

@Import通过导入类名的方式将实例纳入到IoC容器中管理。

//类定义
public class Square {}
public class Circular {}
//导入
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig{}

@ImportResource是通过指定配置文件目录的方式将实例纳入到IoC容器中管理。

@ImportResource("classpath:spring-redis.xml")      //导入xml配置
public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

1.Spring MVC常用注解

  • @RequestMapping、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

这些都是处理url请求映射的注解,其中@RequestMapping需要设定url和请求方法,@GetMapping、@PostMapping、@PutMapping、@DeleteMapping几个注解已经指定了具体方法,可以当做@RequestMapping的简洁方式,常见用法是:@RequestMapping(value=“/users”,method=RequestMethod.GET)

  • @PathVariable、@RequestParam、@RequestHeader、@RequestBody

@PathVariable负责将url中的模板参数映射到方法参数中。

@RequestParam是获取Request传输来的Query数据。

@RequestHeader是获取Requst中的header部分数据。

@RequestBody获取Resquest中的body部分,支持参数在body里面。

  • @RestController、@ResponseBody

@RestController加在控制器上,表示该控制器中返回的值放到respondseBody中。@RestController是@ResponseBody和@Controller的结合。

  • @SessionAttributes

将值放放到session中。

  • @ModelAttribute

注解在方法上表示在其他Controller运行之前运行。

2.Hibernate Validator格式校验注解

todo

二、SpringBoot常用注解

  • @SpringBootApplication、@EnableAutoConfiguration

这个是Springboot的核心注解。用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解的组合。

其中@EnableAutoConfiguration是开启Springboot自动配置,Springboot会根据当前类目录下jar包和类的情况来自动配置bean实例。比如当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

  1. 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
  2. 去重,并将exclude和excludeName属性携带的类排除;
  3. 过滤,将满足条件(@Conditional)的自动配置类返回;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
   String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
   Class<?>[] exclude() default {};
   String[] excludeName() default {};
}
  • @AutoConfigureAfter、@AutoConfigureBefore

@AutoConfigureAfter用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。

@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}

@AutoConfigureBefore用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之前。

1.常用条件注解

  • @ConditionalOnBean、@ConditionalOnMissingBean

@ConditionalOnBean(A.class)表示只要当A实例存在是才实例化该Bean实例。

@Bean
//当前环境上下文存在DefaultMQProducer实例时,才能创建RocketMQProducerLifecycle这个Bean
@ConditionalOnBean(DefaultMQProducer.class)
public RocketMQProducerLifecycle rocketMQLifecycle() {
     return new RocketMQProducerLifecycle();
}

@ConditionalOnMissingBean(B.class)和@ConditionalOnBean(A.class)相反,只有当B实例不存在的时候才实例化该Bean实例。

@Bean
//当前环境上下文存在DefaultMQProducer实例时,才能创建RocketMQProducerLifecycle这个Bean
@ConditionalOnBean(DefaultMQProducer.class)
public RocketMQProducerLifecycle rocketMQLifecycle() {
     return new RocketMQProducerLifecycle();
}
  • @ConditionalOnClass、@ConditionalOnMissingBean

@ConditionalOnClass是当某些类存在于classpath上时候才创建某个Bean。

@Bean
  //当classpath中存在类HealthIndicator时,才创建HealthIndicator Bean对象
  @ConditionalOnClass(HealthIndicator.class)
  public HealthIndicator rocketMQProducerHealthIndicator(Map<String, DefaultMQProducer> producers) {
      if (producers.size() == 1) {
          return new RocketMQProducerHealthIndicator(producers.values().iterator().next());
      }
  }

@ConditionalOnMissingBean是当某些类不存在于classpath上时候才创建某个Bean。

@Bean
  //仅当当前环境上下文缺失RocketMQProducer对象时,才允许创建RocketMQProducer Bean对象
  @ConditionalOnMissingBean(RocketMQProducer.class)
  public RocketMQProducer mqProducer() {
      return new RocketMQProducer();
  }
  • @ConditionalOnProperty

当指定的属性有指定的值时才开启配置。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。

@Bean
 //匹配属性rocketmq.producer.enabled值是否为true
 @ConditionalOnProperty(value = "rocketmq.producer.enabled", havingValue = "true", matchIfMissing = true)
 public RocketMQProducer mqProducer() {
     return new RocketMQProducer();
 }

2.数据绑定相关注解

  • @ConfigurationProperties

Spring Boot可使用注解的方式将自定义的properties文件映射到实体bean中,比如config.properties文件。

@Data
@ConfigurationProperties("rocketmq.consumer")
public class RocketMQConsumerProperties extends RocketMQProperties {
    private boolean enabled = true;
    private String consumerGroup;
    private MessageModel messageModel = MessageModel.CLUSTERING;
    private ConsumeFromWhere consumeFromWhere = ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET;
}
  • @EnableConfigurationProperties

当@EnableConfigurationProperties注解应用到你的@Configuration时,任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。 这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。

@Configuration
@EnableConfigurationProperties({
    RocketMQProducerProperties.class,
    RocketMQConsumerProperties.class,
})
@AutoConfigureOrder
public class RocketMQAutoConfiguration {
    @Value("${spring.application.name}")
    private String applicationName;
}
  • @PropertySource

@PropertySource读取指定的properties 文件。

@Component
@PropertySource("classpath:website.properties")
class WebSite {
    @Value("${url}")
    private String url;
}
  • @value

使用 @Value(“${property}”)读取比较简单的配置信息。

@Value("${value1}")
String value1;

TODO

  • 需要补充Hibernate Validator格式校验注解。

参考资料

  1. Spring mvc 常用注解:https://blog.csdn.net/github_36379934/article/details/69951541
  2. spring 常用注解:https://mp.weixin.qq.com/s/c9c_2ui9NGzXh3Efg-04Vg
  3. Spring常用注解(绝对经典):https://blog.csdn.net/guorui_java/article/details/107347754:https://blog.csdn.net/guorui_java/article/details/107347754
  4. springboot有哪些常用注解?:https://www.cnblogs.com/wangcp-2014/p/13604293.html
  5. SpringBoot中常见注解含义总结:https://blog.51cto.com/u_16159391/6470251
  6. Spring Boot最核心的27个干货注解,你了解多少?:https://zhuanlan.zhihu.com/p/67976768
  7. SpringBoot常用注解的大全(持续更新):https://www.modb.pro/db/220736 (可以参考其中关于格式校验的注解)


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
14天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
2天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
14 4
SpringBoot必须掌握的常用注解!
|
4天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
27 2
|
4天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
19 1
|
18天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
22天前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
47 2
|
11天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。
|
6月前
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
50 0
|
23天前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
38 0
|
5月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
50 0