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

server/2025/2/6 0:02:49/

        今天,这篇文章带你将深入理解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 {@Beanpublic 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 {@Autowiredprivate 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: MyApplicationversion: 2servers:- 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");}@Overridepublic void setBeanName(String name) {System.out.println("2. 设置 Bean 名称");}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("3. 设置 BeanFactory");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("4. 初始化 Bean");}@Overridepublic void destroy() throws Exception {System.out.println("6. 销毁 Bean");}@PostConstructpublic void init() {System.out.println("5. @PostConstruct 注解的初始化方法");}@PreDestroypublic void preDestroy() {System.out.println("7. @PreDestroy 注解的销毁前方法");}
}

 十、注解关系图谱

 总结

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


http://www.ppmy.cn/server/165273.html

相关文章

Workbench 中的热源仿真

探索使用自定义工具对移动热源进行建模及其在不同行业中的应用。 了解热源动力学 对移动热源进行建模为各种工业过程和应用提供了有价值的见解。激光加热和材料加工使用许多激光束来加热、焊接或切割材料。尽管在某些情况下&#xff0c;热源 &#xff08;q&#xff09; 不是通…

DeepSeek的崛起与全球科技市场的震荡

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展不断重塑全球科技格局。 近日&#xff0c;中国初创企业DeepSeek推出了一款据称成本极低且性能强大的AI模型&#xff0c;引发全球市场的剧烈反应。NVIDIA、台积电等半导体和AI科技巨头股价大幅下跌&am…

两栏布局、三栏布局、水平垂直居中

文章目录 1 两栏布局1.1 浮动 margin1.2 浮动 BFC1.3 flex布局1.4 左绝父相 margin1.5 右绝父相 方向定位 2 三栏布局2.1 子绝父相 margin2.2 flex布局2.3 浮动 margin2.4 圣杯布局2.5 双飞翼布局 3 水平垂直居中3.1 绝对定位 translate3.2 绝对定位 margin3.3 绝对定位…

Android-音频采集

前言 音视频这块&#xff0c;首先是要先采集音频。今天我们就来深入探讨一下 Android 音频采集的两大类型&#xff1a;Mic 音频采集和系统音频采集。 Mic音频采集 Android提供了两个API用于实现录音功能&#xff1a;android.media.AudioRecord、android.media.MediaRecorder。…

从Transformer到世界模型:AGI核心架构演进

文章目录 引言:架构革命推动AGI进化一、Transformer:重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破三、构建世界模型的技术路径3.1 …

Flink报错Caused by: java.io.FileNotFoundException: /home/wc.txt

当在提交一个flink任务报如下的错误时&#xff1a; Caused by: java.io.FileNotFoundException: /home/wc.txt (没有那个文件或目录)at java.io.FileInputStream.open0(Native Method)at java.io.FileInputStream.open(FileInputStream.java:195)at java.io.FileInputStream.&…

Python-基于PyQt5,wordcloud,pillow,numpy,os,sys的智能词云生成器

前言&#xff1a;日常生活中&#xff0c;我们有时后就会遇见这样的情形&#xff1a;我们需要将给定的数据进行可视化处理&#xff0c;同时保证呈现比较良好的量化效果。这时候我们可能就会用到词云图。词云图&#xff08;Word cloud&#xff09;又称文字云&#xff0c;是一种文…

深度学习探索:ChatGPT数据分析精髓 梯度下降优化方法深度剖析

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…