likes
comments
collection
share

Spring和Springboot常见注解

作者站长头像
站长
· 阅读数 10

本文主要介绍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 常用注解:blog.csdn.net/github_3637…
  2. spring 常用注解:mp.weixin.qq.com/s/c9c_2ui9N…
  3. Spring常用注解(绝对经典):blog.csdn.net/guorui_java…
  4. springboot有哪些常用注解?:www.cnblogs.com/wangcp-2014…
  5. SpringBoot中常见注解含义总结:blog.51cto.com/u_16159391/…
  6. Spring Boot最核心的27个干货注解,你了解多少?:zhuanlan.zhihu.com/p/67976768
  7. SpringBoot常用注解的大全(持续更新):www.modb.pro/db/220736 (可以参考其中关于格式校验的注解)