Spring 中的常用注解

Spring 作为 Java 企业级开发中最广泛使用的框架之一,以其强大的功能和灵活性为开发者提供了高效的开发体验。在 Spring 中,注解(Annotation)是其核心机制之一,它简化了配置文件的繁琐操作,通过声明的方式实现了依赖注入等功能。

本篇文章将介绍 Spring 框架中一些常用的注解,并结合实际场景详细说明它们的使用方法与作用。这不仅可以帮助初学者快速掌握 Spring 的基本用法,也能为有经验的开发者提供一个参考,帮助在实际开发中更高效地使用这些工具。

通过对注解的深入了解,你将能够更加轻松地掌控 Spring 框架,提高开发效率,为企业级应用开发提供强有力的支持。让我们一起走进 Spring 注解的世界,探索它的奥秘!


文章目录


1、核心注解:Bean、配置和自动扫描

1.1、@Configuration

模块:spring-context 模块。

作用:标记一个类为配置类,类似于传统 XML 配置中的 <beans> 标签,表示该类中定义的 Bean 都会被 Spring 容器管理。

使用方式:通常与 @Bean 注解一起使用,在配置类中定义 Bean。

使用示例:

java 复制代码
@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}
1.2、@Bean

模块:spring-context 模块。

作用:标记方法为 Bean 定义,用于将方法返回的对象注册到 Spring 容器中,通常配合 @Configuration 使用。

使用方式:在 @Configuration 注解标注的类中,使用 @Bean 注解将方法返回值作为 Bean 注册到容器。

2.3、@Component

模块:spring-context 模块。

作用:标记类为 Spring 的组件(Bean),Spring 会自动扫描并将其注册到容器中。@Component 是一个通用的注解,可以通过 @ComponentScan 来扫描指定包中的类。

使用示例:

java 复制代码
package com.lizhengi.service

@Component
public class MyService {
    // Service logic
}

常见衍生注解:

  • @Service:通常用于服务层的 Bean。
  • @Repository:通常用于数据访问层的 Bean,包含数据访问相关的异常转换功能。
  • @Controller:通常用于标注 Spring MVC 中的控制器。
2.4、@ComponentScan

模块:spring-context 模块。

作用:用于自动扫描指定包中的 @Component 注解类,自动将它们注册到 Spring 容器中。通常配合 @Configuration 使用。

使用方式:指定要扫描的包或包的路径,自动注册标记为 @Component、@Service、@Repository 和 @Controller 等注解的类。

使用示例:

java 复制代码
@Configuration
@ComponentScan(basePackages = "com.lizhengi")
public class AppConfig {
    // 自动扫描指定包中的 Bean
}

2、依赖注入相关的注解

2.1、@Autowired

模块:spring-bean 模块。

作用:自动装配 Bean,Spring 会自动根据类型注入依赖的 Bean。如果有多个符合条件的 Bean,可以使用 @Qualifier 注解进一步指定注入的具体 Bean。

使用方式:可以标注在构造函数、字段或 setter 方法上。

使用示例:

java 复制代码
@Component
public class MyService {
    @Autowired
    private MyRepository myRepository;  // 自动注入
}
2.2、@Qualifier

模块:spring-bean 模块。

作用:与 @Autowired 配合使用,用于指定注入哪个 Bean。当容器中有多个相同类型的 Bean 时,使用 @Qualifier 注解可以明确指定要注入的 Bean 名称。

使用方式:通常在字段或构造方法中与 @Autowired 配合使用。

使用示例:

java 复制代码
@Autowired
@Qualifier("myRepositoryImpl")
private MyRepository myRepository;
2.3、@Primary

模块:spring-context 模块。

作用:在存在多个符合条件的 Bean 时,标记该 Bean 为首选 Bean,Spring 会优先注入 @Primary 标记的 Bean。

使用方式:通常配合 @Autowired 使用。

使用示例:

java 复制代码
@Component
@Primary
public class PrimaryService implements MyService {
    // 该 Bean 会优先被注入
}
2.4、@Value

模块:spring-bean 模块。

作用:用于注入外部化配置的值,例如属性文件中的值、SpEL 表达式等。

使用方式:可以注入简单类型、数组、List 或其他自定义配置。

使用示例:

java 复制代码
@Component
public class MyService {
    @Value("${app.name}")
    private String appName;  // 注入配置文件中的值
}

3、生命周期相关

3.1、@PostConstruct

模块:Java EE 标准的一部分,位于 javax.annotation 包中。spring-context 模块提供支持。

作用:标记的方法会在 Bean 初始化后执行,通常用于执行一些初始化任务。

使用方式:可以在任何一个 @Component 或 @Bean 注解的方法上使用。

使用示例:

java 复制代码
@Component
public class MyService {
    @PostConstruct
    public void init() {
        // 初始化逻辑
    }
}
3.2、@PreDestroy

模块:Java EE 标准的一部分,位于 javax.annotation 包中。spring-context 模块提供支持。

作用:标记的方法会在 Bean 销毁前执行,通常用于执行清理任务。

使用方式:用于标注一个销毁方法,在容器销毁之前调用。

使用示例:

java 复制代码
@Component
public class MyService {
    @PreDestroy
    public void cleanup() {
        // 清理资源
    }
}

4、其他常用注解

4.1、@Transactional

模块:spring-transaction 模块。

作用:标记方法或类需要进行事务管理,Spring 会为其自动创建事务,确保数据库操作的一致性。

使用方式:可以标注在类或方法上,定义事务的传播行为、隔离级别等。

使用示例:

java 复制代码
@Service
@Transactional
public class MyService {
    public void someBusinessMethod() {
        // 业务逻辑,自动参与事务管理
    }
}
4.2、@Scope

模块:spring-context 模块。

作用:用于定义 Bean 的作用域,Spring 默认的作用域是单例(singleton),但也可以设置为其他作用域,如 prototype(原型),request,session 等。

使用方式:可以标注在 @Component、@Service、@Controller 等注解的类上。

使用示例:

java 复制代码
@Component
@Scope("prototype")
public class MyService {
    // 每次请求都返回一个新的实例
}
4.3、@Import

模块:spring-context 模块。

作用:用于引入其他配置类。通过 @Import 注解,可以将其他的 Java 配置类导入到当前配置类中,帮助实现模块化配置。

使用方式:可以通过 @Import 导入一个或多个配置类。

使用示例:

java 复制代码
@Configuration
@Import({OtherConfig.class, AnotherConfig.class})
public class AppConfig {
    // 自动加载其他配置类中的 Bean
}
4.4、@Lazy

模块:spring-context 模块。

作用:标注 Bean 为延迟加载,只有在第一次使用时才会创建实例。

使用方式:可以标注在类或方法上。

使用示例:

java 复制代码
@Component
@Lazy
public class MyService {
    // 只有在第一次使用时才会被初始化
}
相关推荐
xuxigifxfh几秒前
牛客:BISHI8 大整数哈希
java·算法·哈希算法
涉密IT资质笔记3 分钟前
涉密资质投入产出分析模型:时间成本、四块成本构成与 ROI 决策框架
java·开发语言·算法
木井巳6 分钟前
【BFS 解决拓扑排序】火星词典
java·算法·leetcode·广度优先·宽度优先·图搜索算法
霸道流氓气质6 分钟前
Java调用StableDiffusion/ComfyUI图像生成:DAG工作流编排、WebSocket实时进度与Flux模型集成的生产级实战
java·websocket·stable diffusion
北风toto16 分钟前
KMP 算法详解:从暴力匹配到 O(n+m) 的字符串搜索
java·开发语言·算法
william_yangshun17 分钟前
WordCraft 观察:纯 Rust 重写文字处理器,把文档变成可编程对象
开发语言·后端·rust·文档自动化
weixin1997010801617 分钟前
《京东JOS API:落地方案、接口边界与业务踩坑 —— 联盟免费 vs 商家按量的双轨制》(附python源码)
java·网络·python
衡石科技20 分钟前
从语义准备到模型验收:HENGSHI SENSE Data Agent 的 RAG 与部署工程实践
java·大数据·人工智能·数据分析·rag
G018_star sky♬21 分钟前
java学习日记-多态与好玩的写法
java
撸串-研究生23 分钟前
面向景区的综合服务管理平台设计——以稻城亚丁景区为例【附源码】
java·开发语言·vue.js·前后端分离·稻城亚丁景区