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一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
5天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
1天前
|
XML Java 数据库连接
Spring框架与Spring Boot的区别和联系
Spring框架与Spring Boot的区别和联系
9 0
|
1天前
|
JSON 前端开发 Java
【JAVA进阶篇教学】第七篇:Spring中常用注解
【JAVA进阶篇教学】第七篇:Spring中常用注解
|
4天前
|
JavaScript Java 开发者
Spring Boot中的@Lazy注解:概念及实战应用
【4月更文挑战第7天】在Spring Framework中,@Lazy注解是一个非常有用的特性,它允许开发者控制Spring容器的bean初始化时机。本文将详细介绍@Lazy注解的概念,并通过一个实际的例子展示如何在Spring Boot应用中使用它。
17 2
|
5天前
|
前端开发 Java
SpringBoot之自定义注解参数校验
SpringBoot之自定义注解参数校验
16 2
|
11天前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
|
11天前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
11天前
|
Java Spring
springboot自带的@Scheduled注解开启定时任务
springboot自带的@Scheduled注解开启定时任务
|
Java 应用服务中间件 Spring
Netweaver的端口号和Spring boot内嵌的Tomcat端口
Netweaver的端口号和Spring boot内嵌的Tomcat端口
86 0
Netweaver的端口号和Spring boot内嵌的Tomcat端口
|
1月前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源