Spring Boot常用注解深度解析:从入门到精通

news/2025/2/5 22:54:45 标签: spring boot, java, 后端

        今天,这篇文章带你将深入理解Spring Boot中30+常用注解,通过代码示例和关系图,帮助你彻底掌握Spring核心注解的使用场景和内在联系。

一、启动类与核心注解

1.1 @SpringBootApplication

组合注解

@SpringBootApplication @Configuration + @EnableAutoConfiguration +@ComponentScan

java">@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

三个核心功能:

  • @Configuration:声明配置类

  • @EnableAutoConfiguration:启用自动配置

  • @ComponentScan:组件扫描(默认扫描启动类所在包及其子包)

二、配置与Bean管理

2.1 @Configuration

声明配置类,内部包含多个@Bean方法

java">@Configuration
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

2.2 @Bean vs @Component

特性@Bean@Component
声明位置配置类方法类级别
控制粒度第三方库类自己编写的类
依赖注入方法参数自动注入字段/构造器

2.3 @Scope Bean作用域

java">@Bean
@Scope("prototype")
public Service prototypeService() {
    return new Service();
}

三、依赖注入(DI)

3.1 @Autowired

自动注入的三种方式:

java">// 构造器注入(推荐)
@Autowired
public MyController(MyService service) {
    this.service = service;
}

// Setter注入
@Autowired
public void setService(MyService service) {
    this.service = service;
}

// 字段注入(不推荐)
@Autowired
private MyService service;

3.2 @Qualifier

解决多个同类型Bean的冲突

java">@Autowired
@Qualifier("mainService")
private Service service;

3.3 @Primary

设置首选Bean

java">@Bean
@Primary
public Service primaryService() {
    return new PrimaryService();
}

四、组件扫描与分层架构

4.1 分层注解

java">@Service
public class UserService {
    // 业务逻辑
}

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;
}

 五、Web开发注解

5.1 请求映射

java">@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
    return userService.findById(id);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User createUser(@RequestBody User user) {
    return userService.save(user);
}

5.2 参数绑定

java">@GetMapping
public List<User> searchUsers(
    @RequestParam(defaultValue = "1") int page,
    @RequestParam(required = false) String name) {
    // 分页查询逻辑
}

六、条件装配注解

6.1 @ConditionalOnProperty

java">@Bean
@ConditionalOnProperty(
    prefix = "feature",
    name = "new-payment",
    havingValue = "true")
public PaymentService newPaymentService() {
    return new NewPaymentService();
}

6.2 其他条件注解

  • @ConditionalOnClass:类路径存在指定类时生效

  • @ConditionalOnMissingBean:容器中不存在指定Bean时生效

七、AOP编程

7.1 切面配置

java">@Aspect
@Component
public class LoggingAspect {
    
    @Pointcut("execution(* com.example.service.*.*(..))")
    private void serviceLayer() {}
    
    @Around("serviceLayer()")
    public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        // 记录方法执行时间
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long duration = System.currentTimeMillis() - start;
        System.out.println(joinPoint.getSignature() + " executed in " + duration + "ms");
        return result;
    }
}

 八、配置属性绑定

8.1 @ConfigurationProperties

java">@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private String name;
    private int version;
    private List<String> servers = new ArrayList<>();
    
    // getters/setters
}

application.yml配置:

app:
  name: MyApplication
  version: 2
  servers:
    - server1
    - server2

 九、Bean 的生命周期

        Spring Boot 中的 Bean 生命周期是理解 Spring 容器管理 Bean 的关键。Bean 的生命周期大致可以分为以下几个阶段:

  1. 实例化(Instantiation):Spring 容器通过调用无参构造方法创建 Bean 实例。

  2. 属性赋值(Population):Spring 容器通过反射将配置文件或注解中定义的属性值注入到 Bean 中。

  3. 初始化前处理(Pre-initialization)

    • BeanNameAware:如果 Bean 实现了 BeanNameAware 接口,Spring 会调用其 setBeanName 方法,将 Bean 的名称传递给 Bean。

    • BeanFactoryAware:如果 Bean 实现了 BeanFactoryAware 接口,Spring 会调用其 setBeanFactory 方法,将 BeanFactory 传递给 Bean。

    • BeanPostProcessor:Spring 会调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法,对 Bean 进行前置处理。

  4. 初始化(Initialization)

    • InitializingBean:如果 Bean 实现了 InitializingBean 接口,Spring 会调用其 afterPropertiesSet 方法进行初始化。

    • @PostConstruct:如果 Bean 中有方法使用了 @PostConstruct 注解,Spring 会调用该方法进行初始化。

  5. 使用(Usage):Bean 已经初始化完成,可以被应用程序使用。

  6. 销毁前处理(Pre-destruction)

    • DisposableBean:如果 Bean 实现了 DisposableBean 接口,Spring 会调用其 destroy 方法进行销毁前的清理工作。

    • @PreDestroy:如果 Bean 中有方法使用了 @PreDestroy 注解,Spring 会调用该方法进行销毁前的清理工作。

  7. 销毁(Destruction):Spring 容器关闭时,销毁 Bean。

java">@Component
public class MyBean implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
    private String name;

    public MyBean() {
        System.out.println("1. 实例化 Bean");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("2. 设置 Bean 名称");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3. 设置 BeanFactory");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("4. 初始化 Bean");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("6. 销毁 Bean");
    }

    @PostConstruct
    public void init() {
        System.out.println("5. @PostConstruct 注解的初始化方法");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("7. @PreDestroy 注解的销毁前方法");
    }
}

 十、注解关系图谱

 总结

        Spring Boot 中的注解和 Bean 生命周期是开发中非常重要的概念。通过合理使用各种注解,可以大大简化开发过程,提高开发效率。同时,理解 Bean 的生命周期有助于更好地管理 Bean 的创建、初始化和销毁过程,确保应用程序的稳定性和可靠性。


http://www.niftyadmin.cn/n/5842452.html

相关文章

2025年最新Stable Diffusion 新手入门教程,安装使用及模型下载

一、安装要求&#xff1a; ① 操作系统&#xff1a;Windows10以后的系统 ② CPU&#xff1a;不做强制性要求 ③ 内存&#xff1a;推荐8G以上 ④ 显卡&#xff1a;必须是Nvidia的独立显卡&#xff0c;显存最低4G&#xff0c;推荐20系以后&#xff1b;A卡、核显只能用CPU跑 …

【数据结构】_栈的结构与实现

目录 1. 栈的相关概念与结构 2. 栈的实现 2.1 栈实现的底层结构选择 2.2 Stack.h 2.3 Stack.c 2.4 Test_Stack.c 1. 栈的相关概念与结构 1、栈&#xff1a;一种特殊的线性表&#xff0c;只允许在固定的一端插入和删除数据&#xff1b; 允许进行数据插入和删除操作的一端…

[LeetCode]day13 19.删除链表的倒数第n个结点

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&a…

pytorch线性回归模型预测房价例子

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 import torch import torch.nn as nn import torch.optim as optim import numpy as np# 1. 创建线性回归模型类 class LinearRegressionModel(nn.Module):def __init__(self):super(LinearRegressionModel, self).…

为AI聊天工具添加一个知识系统 之86 详细设计之27 数据处理:ETL

本文要点 ETL 数据提取 作为 数据项目的起点。数据的整个三部曲--里程碑式的发展进程&#xff1a; ETL : 1分形 Type()-层次Broker / 2完形 Method() - 维度Delegate /3 整形 Class() - 容器 Agent 1变象。变象 脸谱Extractor - 缠度&#xff08;物理 皮肤缠度&#xf…

04树 + 堆 + 优先队列 + 图(D1_树(D17_综合刷题练习))

目录 1. 二叉树的前序遍历&#xff08;简单&#xff09; 1.1. 题目描述 1.2. 解题思路 方法一&#xff1a;递归&#xff08;推荐使用&#xff09; 方法二&#xff1a;非递归&#xff08;扩展思路&#xff09; 2. 二叉树的中序遍历&#xff08;中等&#xff09; 2.1. 题目…

2025_1_31 C语言中关于数组和指针

1.数组作为指针传递 数组作为指针传递可以&#xff1a; 加一个数减一个数两个指针相减自增自减 int main() {int arr[] { 1,2,3,4,5,6,7,8,9 };printf("%d\n", arr[0] 2);printf("%d\n", arr[2] - 2);printf("%d\n", arr[0] arr[2]);int* …

Spring Security(maven项目) 3.0.3.0版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…