万字知识篇(2):SpringBoot的常用注解(上)

打印 上一主题 下一主题

主题 1790|帖子 1790|积分 5370

SpringBoot的常用注解非常的多,一篇文章根本讲不完,将分为上下两章,通过本章你将会系统的学习到:
  

  • 1. 注解在SpringBoot中的作用
  • 2. SpringBoot 常用注解速查表
  • 3. 核心启动类注解
  • 4. @Configuration
  • 5. @Bean
  • 6. @PropertySource
  • 7. @Value
  • 8. @ConfigurationProperties
  • 9. @Import
  • 10. @Autowired
  • 11. @Qualifier
  • 12. @Primary
  • 13. @Lazy

  

一、SpringBoot的注解

1.1 注解在SpringBoot中的作用

  说到SpringBoot的注解,那我们先来说一下注解在SpringBoot中起到了什么作用。SpringBoot 采用 “约定优于配置” 的理念,使用注解更换传统的 XML 配置,使代码更轻便、易读。比方我们可以使用@Configuration它的作用是声明一个类为配置类,他会更换 XML配置文件。
1.2 SpringBoot 常用注解速查表

  我们先来快速的相识一下常用的注解,然后再具体的讲解这些。
分类注解功能分析核心启动类@SpringBootApplication核心启动注解,整合了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan,启用主动配置和组件扫描核心启动类@EnableAutoConfiguration启用 Spring Boot 的主动配置机制,根据依赖主动配置 Spring 应用核心启动类@ComponentScan主动扫描指定包及其子包下的 Spring 组件(@Component、@Service 等)核心启动类@SpringBootConfiguration标记当前类为 Spring Boot 的配置类,等价于传统的 @Configuration 注解配置类@Configuration标记类为 Spring 配置类,更换 XML 配置文件配置类@Bean声明方法返回的对象由 Spring IoC 容器管理,支持单例/原型作用域配置类@PropertySource加载指定的 properties/yml 配置文件,支持多文件加载和编码设置配置类@ConfigurationProperties将配置文件中的属性批量绑定到 Java 对象,支持嵌套属性和疏松绑定配置类@Import导入其他配置类或普通类到当前 Spring 上下文依赖注入@Autowired主动按类型注入依赖,支持构造器/Setter/字段注入,优先按类型匹配依赖注入@Qualifier配合 @Autowired 使用,按指定名称注入 Bean,解决类型冲突依赖注入@Primary标记优先注入的 Bean,当存在多个同类型 Bean 时见效依赖注入@Value注入属性值,支持 SpEL 表达式和默认值(${key:default})依赖注入@Lazy延迟初始化 Bean,首次请求时才会创建Web 开辟@RestController组合注解,包含 @Controller 和 @ResponseBody,直接返回 JSON/XML 相应Web 开辟@RequestMapping定义请求映射路径,可通过 method 指定 HTTP 方法(GET/POST 等)Web 开辟@GetMapping专用于处理 GET 请求的简写情势,等同于 @RequestMapping(method=GET)Web 开辟@PostMapping专用于处理 POST 请求的简写情势Web 开辟@PathVariable从 URI 模板中提取变量值,支持 required 和默认值设置Web 开辟@RequestParam获取查询参数或表单数据,支持参数名映射、必填校验和默认值Web 开辟@RequestBody将请求体内容(JSON/XML)反序列化为 Java 对象,支持校验Web 开辟@ResponseBody将方法返回值序列化为相应体(JSON/XML)Web 开辟@ResponseStatus自定义 HTTP 相应状态码,可用于类或方法上Web 开辟@ExceptionHandler声明异常处理方法,处理特定异常并返回自定义相应Web 开辟@ControllerAdvice全局控制器增强,团结 @ExceptionHandler 实现统一异常处理Web 开辟@CrossOrigin启用跨域请求支持,可配置 origins、methods 等参数Web 开辟@CookieValue获取 Cookie 中的值,支持 required 和默认值Web 开辟@RequestHeader获取请求头中的值,支持 header 名映射和必填校验Web 开辟@SessionAttribute访问 session 中的属性数据校验@Valid触发 JSR-303 校验,可级联校验嵌套对象数据校验@ValidatedSpring 的校验注解,支持分组校验数据校验@NotNull校验字段不为 null数据校验@NotBlank校验字符串不为空且至少包含一个非空缺字符数据校验@Size校验集合/数组/字符串的大小在指定范围内数据校验@Pattern校验字符串匹配正则表达式数据校验@Email校验字符串为合法的邮箱格式数据访问-JPA@Entity标记类为 JPA 实体,对应数据库表数据访问-JPA@Table指定实体对应的数据库表名,默认使用类名数据访问-JPA@Id声明主键字段数据访问-JPA@GeneratedValue配置主键天生策略(IDENTITY/SEQUENCE/TABLE/AUTO)数据访问-JPA@Column配置字段与数据库列的映射关系(name/length/unique 等)数据访问-JPA@Transient标记字段不持久化到数据库数据访问-JPA@OneToMany定义一对多关联关系,可配置级联操作和加载策略数据访问-JPA@ManyToOne定义多对一关联关系数据访问-JPA@JoinColumn配置关联关系的数据库外键列数据访问-MyBatis@Mapper标记接口为 MyBatis Mapper,由 MyBatis 动态实现数据访问-MyBatis@Select声明 SQL 查询语句数据访问-MyBatis@Insert声明 SQL 插入语句数据访问-MyBatis@Update声明 SQL 更新语句数据访问-MyBatis@Delete声明 SQL 删除语句数据访问-MyBatis@Param指定 MyBatis 方法参数的名称事件管理@Transactional声明事件,可配置隔离级别、流传行为、超时和只读属性事件管理@EnableTransactionManagement启用声明式事件管理定时使命@EnableScheduling启用定时使命支持定时使命@Scheduled声明定时使命,支持 cron/fixedDelay/fixedRate 表达式Spring Security@EnableWebSecurity启用 Spring Security 配置Spring Security@PreAuthorize方法级权限控制,支持 SpEL 表达式(如 hasRole('ADMIN'))Spring Security@PostAuthorize方法实行后进行权限校验Spring Security@Secured基于角色列表的权限控制(需启用 @EnableGlobalMethodSecurity)Spring Security@EnableGlobalMethodSecurity启用方法级安全控制测试@SpringBootTest标记 Spring Boot 集成测试类,加载完整应用上下文测试@DataJpaTest仅加载 JPA 相干配置的切片测试测试@WebMvcTest仅加载 Web MVC 相干配置的切片测试测试@MockBean向 Spring 上下文注入 Mock 对象,更换真实 Bean测试@SpyBean向 Spring 上下文注入 Spy 对象,部分 Mock 真实 Bean测试@TestConfiguration定义测试专用的配置类,不会影响主配置 二、核心启动类注解

  在 SpringBoot中,核心启动类是整个应用的入口,而 @SpringBootApplication 是启动类的核心注解。它的作用远不止标记一个类为启动类,而是通过组合多个关键注解实现主动化配置和组件扫描。
   

  • 作用目标:类(必须标注在主类上)
  • 核心功能:这是 SpringBoot 应用的核心入口注解,本质上是三个关键注解的组合。
  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan
  4. public @interface SpringBootApplication { ... }
复制代码

(1) @SpringBootConfiguration
功能


  • 标记当前类为 Spring Boot 的配置类,等价于传统的 @Configuration 注解。
  • 表明该类中可能包含通过 @Bean 注解定义的 Spring 容器管理的对象。

(2) @EnableAutoConfiguration
功能


  • 启用SpringBoot的主动配置机制,根据项目的依赖(如 spring-boot-starter-web、spring-boot-starter-data-jpa)主动配置 Spring 应用。
  • 主动加载文件中定义的配置类(如 DataSourceAutoConfiguration、WebMvcAutoConfiguration)。
工作原理


  • 扫描类路径下的 JAR 包,检测是否有预定义的配置类(如发现 HikariDataSource 则主动配置数据源)。
  • 根据条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean)动态决定是否启用配置。

(3) @ComponentScan
功能


  • 主动扫描当前包及其子包下的组件,包罗 @Component、@Service、@Repository、@Controller 等注解标记的类。
  • 将这些组件注册为 SpringBean,无需手动在 XML 或 JavaConfig 中定义。
默认扫描路径


  • 主启动类所在的包作为根包。
  • 若主类在 com.example.demo 包下,则主动扫描 com.example.demo 及其子包。
三、配置类注解

3.1 @Configuration

作用:标记一个类为配置类,告诉Spring容器这个类是用来定义Bean的。
   想象你要开一家奶茶店,@Configuration 就像是你的 “开店指导手册”,用来告诉 Spring(你的开店助手)两件事:
1.“这个类很告急!”
  

  • 就像在手册封面写上《XX奶茶店操作指南》,告诉助手:“这是我们的核心配置”。
  2.“这里有制作奶茶的配方!”
  

  • 手册里的每个方法(用 @Bean 标记)都是一个具体配方,比如:

    • “珍珠奶茶配方”
    • “芝士奶盖配方”

  当 Spring 看到 @Configuration 时:


  • 会把这个类 当作特殊分析书 加载
  • 实行里面全部带 @Bean 的方法,把返回的对象 存入"原料仓库"(Spring 容器)
  • 其他类需要时,直接问仓库要(通过 @Autowired)
和普通类的区别
普通类@Configuration 类Spring 当它是路人甲Spring 当它是 VIP 分析书里面的方法随便写带 @Bean 的方法会被特殊处理不会被主动调用Spring 会主动实行全部 @Bean 方法
3.2 @Bean

作用:用于声明一个Bean。被@Bean注解标记的方法会被Spring容器调用,并将返回的对象纳入管理。
   @Bean 是 Spring 中的一个告急注解,它的作用就是 告诉 Spring:这个方法会返回一个对象,你要把这个对象管理起来!
简单来说,@Bean 就是 手工造零件,然后交给 Spring 的“零件仓库”(IoC 容器)去管理,其他类要用的时候,Spring 会主动提供。
  1. @Configuration // 这是一本开店手册
  2. public class TeaShopConfig {
  3.    
  4.     @Bean // 这是"珍珠奶茶"的配方
  5.     public MilkTea pearlMilkTea() {
  6.         MilkTea tea = new MilkTea();
  7.         tea.addIngredient("珍珠");
  8.         tea.addIngredient("红茶");
  9.         return tea;
  10.     }
  11.     @Bean // 这是"芝士奶盖"的配方
  12.     public CheeseFoam cheeseFoam() {
  13.         return new CheeseFoam();
  14.     }
  15. }
复制代码
  虽然 @Bean 不一定必须用在 @Configuration 类中,但为了代码的可读性和维护性,发起将@Bean方法会合放在 @Configuration 类中。

3.3 @PropertySource

作用:用于加载指定的属性文件到 Spring 的环境中,从而可以在应用中使用这些属性值。
功能:


  • 加载指定的.properties 或.yml文件
  • 将文件中的属性添加到Spring的Environment中
  • 支持通过@Value或Environment对象获取属性值
     路径可以是类路径下的资源文件(使用 classpath: 前缀)。在 Spring 框架中,使用 classpath: 前缀时,Spring 会主动在应用步伐的 类路径(Classpath) 中查找资源文件类路径通常包罗以下几个部分:
  

  • 项目的 src/main/resources 目录:在 Maven 或 Gradle 项目中,src/main/resources 是存放资源文件的标准目录。
  • 这些文件在构建过程中会被复制到目标输出目录(如 target/classes 或 build/classes)。
  • 假如资源文件位于类路径下的某个子目录中,可以通过路径来指定。比方:@PropertySource("classpath:config/my.properties")
  1. @Configuration
  2. @PropertySource("classpath:application.yml")
  3. public class TestConfigure {
  4. }
复制代码
  springBoot中属性加载优先级:
  

  • application.properties (最高优先级)
  • @PropertySource 指定的文件
  • 系统环境变量
  • 命令行参数
  同时还能加载多个配置文件
  1. @Configuration
  2. @PropertySources({
  3.     @PropertySource("classpath:default.properties"),
  4.     @PropertySource("classpath:env-specific.properties")
  5. })
  6. public class AppConfig { ... }
复制代码
避免加载 application.properties
  不推荐使用@PropertySource 加载以 application 为前缀的配置文件(如 application-dev.properties),因为这些文件通常会被 SpringBoot 主动加载,可能导致配置值被覆盖。
不支持直接加载 YAML 格式的配置文件
  @PropertySource 注解本身不支持直接加载 YAML 格式的配置文件。@PropertySource 主要用于加载 .properties 文件,而不是 .yml 文件。假如你实验使用 @PropertySource 加载 .yml 文件,Spring 会抛堕落误,因为 @PropertySource 默认只支持 .properties 格式的文件。
3.4 @Value(依赖注入注解)

  @Value是 Spring 中一个非常常用的注解,主要用于将配置文件中的值注入到 Spring 管理的 Bean 中。它可以从配置文件(如 application.properties 或 application.yml)中读取属性值,也可配合上述讲过的注解@PropertySource 指定的文件的文件读入属性,并将其注入到字段、构造函数或方法参数中。
功能


  • 从配置文件读取值(比如 application.properties)
  • 注入系统环境变量
  • 直接赋固定值
  • 支持 SpEL 表达式(可以算数学题、调用方法等)
   看一个小例子:

在配置类中使用value注入属性

没有问题,乐成注入,Spring 会主动实行全部 @Bean 方法,而且application.yml是spring主动导入的一个注解文件,不消我们在显示的引入这个文件。

    那假如我们需要的值在Value.properties下面呢?

服务器报错了

我们需要用@PropertySource注入value.properties

没问题

  3.5 @ConfigurationProperties

作用
  将配置文件(如 application.properties 或 application.yml)中的属性值绑定到一个 Java 对象的字段上。它支持疏松绑定,即配置文件中的属性名可以与 Java 字段名不完全同等,但可以通过一定的规则进行匹配。
   假设你的 application.yml 里有这样一段配置:

假如用 @Value,你要写很多重复代码:

而用 @ConfigurationProperties,你可以:
✅ 主动绑定整个配置段到一个 Java 对象
✅ 支持嵌套属性
✅ 主动类型转换(String → int/boolean 等)
✅ 提供 IDE 主动提示(配合 spring-boot-configuration-processor)

之后就可以在别的地方使用了

乐成注入,没有问题

  3.6 @Import

作用
将一个或多个配置类引入到当前配置类中,从而实现模块化的配置管理。
主要功能


  • 引入其他配置类:可以将其他@Configuration类导入到当前配置类中
  • 引入普通类:可以将普通类作为bean定义导入到Spring容器中
  • 引入ImportSelector实现:可以动态选择要导入的配置
  • 引入ImportBeanDefinitionRegistrar实现:可以编程式地注册bean定义
  1. @Configuration
  2. class DatabaseConfig {
  3.     @Bean
  4.     public DataSource dataSource() {
  5.         // 数据源配置
  6.     }
  7. }
  8. @Configuration
  9. @Import(DatabaseConfig.class)
  10. class AppConfig {
  11.     // 现在可以使用DatabaseConfig中定义的bean
  12. }
复制代码
  1. public class Service {
  2.     // 业务逻辑
  3. }
  4. @Configuration
  5. @Import(Service.class)
  6. class AppConfig {
  7.     // Service类将被注册为Spring bean
  8. }
复制代码
四、依赖注入注解

4.1 @Autowired

  @Autowired 是 Spring 框架中最核心的注解之一,用于实现依赖注入DI。
根本作用
@Autowired 的主要功能是主动装配 Spring 容器中的 bean:


  • 主动为类成员(字段、构造器、方法)注入依赖对象
  • 消除显式的 getter/setter 和手动装配代码
  • 是 Spring 依赖注入的核心实现方式
  1. @Service
  2. public class UserService {
  3.     @Autowired
  4.     private UserRepository userRepository;
  5. }
复制代码
上述这种方式是Spring不推荐的方式,Spring推荐的方式是通过构造函数注入
  1. @RestController
  2. @RequestMapping("/dept")
  3. @Tag(name = "组织结构管理")
  4. @Slf4j
  5. public class DepartmentController {
  6.     private final DepartmentService departmentService;
  7.     private final UserService userService;
  8.    
  9.     @Autowired // 构造函数注入
  10.     public DepartmentController(DepartmentService departmentService, UserService userService) {
  11.         this.departmentService = departmentService;
  12.         this.userService = userService;
  13.     }
  14. }
复制代码
在Spring 4.3+ 后,假如一个类里面只有一个构造函数,可省略 @Autowired
  1. @RestController
  2. @RequestMapping("/dept")
  3. @Tag(name = "组织结构管理")
  4. @Slf4j
  5. public class DepartmentController {
  6.     private final DepartmentService departmentService;
  7.     private final UserService userService;
  8.     public DepartmentController(DepartmentService departmentService, UserService userService) {
  9.         this.departmentService = departmentService;
  10.         this.userService = userService;
  11.     }
  12. }
复制代码
同时也是可选依赖
  1. @Autowired(required = false)
  2. private OptionalDependency dependency; // 找不到bean时不报错
复制代码
4.2 @Qualifier

  @Qualifier 是 Spring 框架中用于解决依赖注入歧义性的告急注解,通常与 @Autowired 配合使用。下面我将全面讲解这个注解的用法和工作原理。
根本作用
@Qualifier 的主要功能是:


  • 当存在多个相同类型的 Bean 时,明确指定要注入哪一个
  • 为主动装配过程提供额外的筛选条件
  • 实现更精确的依赖注入控制
  1. @Configuration
  2. public class AppConfig {
  3.     @Bean
  4.     public DataSource masterDataSource() {
  5.         return new MasterDataSource();
  6.     }
  7.     @Bean
  8.     public DataSource slaveDataSource() {
  9.         return new SlaveDataSource();
  10.     }
  11. }
  12. @Service
  13. public class UserService {
  14.     @Autowired
  15.     @Qualifier("masterDataSource") // 明确指定bean名称
  16.     private DataSource dataSource;
  17. }
复制代码
4.3 @Primary

  @Primary 是 Spring 框架中用于标记首选的 Bean的注解,当存在多个相同类型的 Bean 时,被标记为 @Primary 的 Bean 会被优先选择。
根本作用
@Primary 的主要功能是:


  • 当存在多个相同类型的 Bean 时,指定默认注入的候选者
  • 解决主动装配时的歧义性问题
  • 作为隐式的、默认的选择机制
  1. @Configuration
  2. public class DataSourceConfig {
  3.    
  4.     @Bean
  5.     @Primary  // 被标记为首选Bean
  6.     public DataSource primaryDataSource() {
  7.         return new PrimaryDataSource();
  8.     }
  9.    
  10.     @Bean
  11.     public DataSource secondaryDataSource() {
  12.         return new SecondaryDataSource();
  13.     }
  14. }
  15. @Service
  16. public class UserService {
  17.     @Autowired
  18.     private DataSource dataSource;  // 会自动注入primaryDataSource
  19. }
复制代码
当然,它还可以在类(组件)上面使用,达到优先级的目的
  1. @Primary
  2. @Service
  3. public class PrimaryPaymentService implements PaymentService {
  4.     // 实现代码
  5. }
  6. @Service
  7. public class SecondaryPaymentService implements PaymentService {
  8.     // 实现代码
  9. }
复制代码
与 @Qualifier 的优先级


  • 当同时存在 @Primary 和 @Qualifier 时,@Qualifier 的优先级更高
  • @Primary 是一种"默认"机制,而 @Qualifier 是"显式指定"机制
4.4 @Lazy

@Lazy 是 Spring 框架中用于延迟初始化的告急注解,它可以控制 Bean 的加载时机,优化应用启动性能并解决某些特殊依赖问题。
根本作用
@Lazy 的主要功能是:


  • 延迟 Bean 的初始化(推迟到第一次被使用时才创建)
  • 解决循环依赖问题
  • 优化应用启动性能(减少启动时加载的 Bean 数目)
  1. @Configuration
  2. public class AppConfig {
  3.     @Bean
  4.     @Lazy  // 延迟初始化
  5.     public ExpensiveService expensiveService() {
  6.         return new ExpensiveService(); // 耗时的初始化操作
  7.     }
  8. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表