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方法,逻辑大致如下:
- 从配置文件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 常用注解:blog.csdn.net/github_3637…
- spring 常用注解:mp.weixin.qq.com/s/c9c_2ui9N…
- Spring常用注解(绝对经典):blog.csdn.net/guorui_java…
- springboot有哪些常用注解?:www.cnblogs.com/wangcp-2014…
- SpringBoot中常见注解含义总结:blog.51cto.com/u_16159391/…
- Spring Boot最核心的27个干货注解,你了解多少?:zhuanlan.zhihu.com/p/67976768
- SpringBoot常用注解的大全(持续更新):www.modb.pro/db/220736 (可以参考其中关于格式校验的注解)
转载自:https://juejin.cn/post/7248131024930996261