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(原型),requestsession 等。

使用方式:可以标注在 @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 {
    // 只有在第一次使用时才会被初始化
}
相关推荐
代码驿站5201 小时前
Scala语言的面向对象编程
开发语言·后端·golang
JINGWHALE11 小时前
设计模式 行为型 模板方法模式(Template Method Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·模板方法模式
一决威严-雪雪3 小时前
springboot整合admin
java·spring boot·后端
小登ai学习3 小时前
框架部分面试题学习
java·学习·面试
Archy_Wang_13 小时前
ASP.NET Core 中使用 Cookie 身份验证
后端·asp.net
new6669993 小时前
Java实现命令模式
java·命令模式
web_132334214364 小时前
简单的spring boot tomcat版本升级
spring boot·后端·tomcat
写代码的熊萌新4 小时前
JAVA2-类与对象编程(1)
java·开发语言
知初~4 小时前
SpringBoot3
java·spring boot·spring·log4j·maven