Spring Boot进阶教程——注解大全(建议收藏!)
博客前言在Spring1.x时代 , 还没出现注解 , 需要大量xml配置文件并在内部编写大量bean标签 。 Java5推出新特性annotation , 为spring的更新奠定了基础 。 从Spring 2.X开始spring将xml配置中的对象ioc过程转化成了注解 。 Spring Boot之所以能够轻松地实现应用的创建及与其他框架快速集成 , 最核心的原因就在于它极大地简化了项目的配置 , 最大化地实现了“约定大于配置”的原则 。 但是注解种类之繁多 , 还能容易引起混淆 , 这才有了本文《SpringBoot进阶教程(六十四)注解大全》 。
要想对SpringBoot注解有个更全面更清晰的认识 , 就需要分个类 , 分别是Spring注解、Spring Web注解、Spring Boot注解、Spring Scheduling注解和注解集合 。 大致可以将注解分为5大类 , 其中前4类是为了便于理解 , 分别从4个类别中抽取了一些单独介绍 。 而最后一个为注解集合 , 即可能会表含前面4种注解 。
Spring注解在Spring Core注解中 , 主要讨论Spring DI和Spring IOC中使用的Spring核心注释 。 众所周知 , Spring DI和Spring IOC是Spring框架的核心概念 。 所以介绍 org.springframework.beans.factory.annotation 和org.springframework.context.annotation 包中的注解 。 这两个包中注解有很多 , 就抽取其中的15个注解 。
Spring Core Annotations:
- @Autowired
- @Qualifier
- @Bean
- @Required
- @Value
- @DependsOn
- @Lazy
- @Lookup
- @Primary
- @Scope
- @Profile
- @Import
- @ImportResource
- @PropertySource
- @PropertySources
文章插图
单单 org.springframework.context.annotation 这个包下面 , 注解就有这老些 , 所以很难列出所有注解举例 , 只能抽一些常用的 。 文末会给出其它注解的作用和定义(尽量给全) 。
1.1 @Autowired
@Autowired是一种注解 , 可以对成员变量、方法和构造函数进行标注 , 来完成自动装配的工作 , @Autowired标注可以放在成员变量上 , 也可以放在成员变量的set方法上 , 也可以放在任意方法上表示 , 自动执行当前方法 , 如果方法有参数 , 会在IOC容器中自动寻找同类型参数为其传值 。
这里必须明确:@Autowired是根据类型进行自动装配的 , 如果需要按名称进行装配 , 则需要配合@Qualifier使用;
1.1.1 构造器注入
@RestControllerpublic class UserController {private UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}}
1.1.2 setter方法注入@RestControllerpublic class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}}
1.1.3 field反射注入@RestControllerpublic class UserController {@Autowiredprivate UserService userService;}
1.2 @Qualifier上面已经说到@Autowired按类型装配Spring Bean 。 如果容器中有多个相同类型的bean , 则框架将抛出NoUniqueBeanDefinitionException ,以提示有多个满足条件的bean进行自动装配 。 程序无法正确做出判断使用哪一个 , 通过将@Qualifier注解与我们想要使用的特定Spring bean的名称一起进行装配 , Spring框架就能从多个相同类型并满足装配要求的bean中找到我们想要的 ,
@Component("studentInfo")public class StudentInfo implements UserInfo {public String userName() {return "student";}}@Component("teacherInfo")public class TeacherInfo implements UserInfo {public String userName {return "teacher";}}@Componentpublic class UserService {@Autowired@Qualifier("studentInfo")private UserInfo userInfo;//todo }
1.3 @Bean@Bean是一个方法级别上的注解 , 主要用在@Configuration注解的类里 , 也可以用在@Component注解的类里 。 添加的bean的id为方法名 。
@Configurationpublic class BeanConfig {@Beanpublic Person userInfo() {return new UserInfo("toutou", 18);}}
这个配置就等同于之前在xml里的配置:
1.4 @Required@Required 注释应用于 bean 属性的 setter 方法 , 它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中 , 否则容器就会抛出一个 BeanInitializationException 异常 。
@Requiredvoid setUserName(String name) {this.name = name;}
1.5 @Value@Value将外部的值动态注入到Bean中 。 "注入外部的值"可以有很多种 , 它可以注入普通字符串、注入java 系统变量、注入表达式结果、注入其他Bean属性、将配置文件 *.properties 或 *. yml 李 配置的 属性 注入、注入文件资源和注入url资源等 。
1.6 @DependsOn
Spring容器载入bean顺序是不确定的 , Spring框架也没有约定特定载入顺序逻辑规范 。 @DependsOn注解可以定义在类和方法上 , 比如说A组件要依赖于B组件 , 那就是B组件需要比A组件先注册到IOC容器中 。
- Spring security CSRF 跨域访问限制问题
- Spring Boot搭建的一个在线文件预览系统
- 面试官:问你一个,Spring事务是如何传播的?
- 对Spring MVC接口进行Mock测试
- 又爆新作!阿里甩出架构师进阶必备神仙笔记,底层知识全梳理
- Spring Cloud Alibaba之 Sentinel
- SpringBoot+MyBatis+MySQL读写分离实现
- SpringBoot构造流程源码分析:Web应用类型推断
- 搭建私有Sentry日志收集系统并集成到springboot
- 从零到进阶架构,覆盖全网所有技术点3283页笔记、pdf教程