本文主要介绍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方法,逻辑大致如下:
- 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
- 去重,并将exclude和excludeName属性携带的类排除;
- 过滤,将满足条件(@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格式校验注解。
参考资料
- Spring mvc 常用注解:https://blog.csdn.net/github_36379934/article/details/69951541
- spring 常用注解:https://mp.weixin.qq.com/s/c9c_2ui9NGzXh3Efg-04Vg
- Spring常用注解(绝对经典):https://blog.csdn.net/guorui_java/article/details/107347754:https://blog.csdn.net/guorui_java/article/details/107347754
- springboot有哪些常用注解?:https://www.cnblogs.com/wangcp-2014/p/13604293.html
- SpringBoot中常见注解含义总结:https://blog.51cto.com/u_16159391/6470251
- Spring Boot最核心的27个干货注解,你了解多少?:https://zhuanlan.zhihu.com/p/67976768
- SpringBoot常用注解的大全(持续更新):https://www.modb.pro/db/220736 (可以参考其中关于格式校验的注解)