当前位置: 首页 > article >正文

08、底层注解-@Configuration详解

# `@Configuration` 注解详解

08、底层注解-@Configuration详解

`@Configuration` 是 Spring 框架中用于定义配置类的核心注解,它允许开发者以 Java 代码的形式替代传统的 XML 配置,声明和管理 Bean。

## 一、基本作用

### 1. 标识配置类

使用 `@Configuration` 注解标记的类被视为 Spring 的配置类,Spring 容器在启动时会自动扫描并处理这些类。

### 2. 定义 Bean

在配置类中,通过 `@Bean` 注解的方法可以定义 Bean。这些方法返回的对象将被注册到 Spring 容器中,供其他组件依赖注入。

```java
@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
```

### 3. 依赖注入

配置类中的 `@Bean` 方法可以接受其他 Bean 作为参数,实现依赖关系的自动装配。

```java
@Configuration
public class AppConfig {

    @Bean
    public MyService myService(MyRepository repository) {
        return new MyServiceImpl(repository);
    }

    @Bean
    public MyRepository myRepository() {
        return new MyRepositoryImpl();
    }
}
```

## 二、核心特性

### 1. 单例模式

默认情况下,`@Configuration` 类中的 `@Bean` 方法返回的 Bean 是单例的,即在整个应用程序生命周期中只创建一个实例。

### 2. 代理机制

#### Full 模式(默认)

- **特性**:`proxyBeanMethods = true`,Spring 使用 CGLIB 为配置类生成代理对象。
- **作用**:确保每次调用 `@Bean` 方法都返回容器中的同一个单例 Bean,避免重复创建。
- **适用场景**:配置类之间存在复杂的依赖关系。

#### Lite 模式

- **特性**:`proxyBeanMethods = false`,不生成代理对象。
- **作用**:每次调用 `@Bean` 方法都会创建新的实例,提升性能。
- **适用场景**:配置类之间没有依赖关系,或希望减少启动时间。

```java
@Configuration(proxyBeanMethods = false) // 启用 Lite 模式
public class AppConfig {
    // ...
}
```

### 3. 条件化配置

结合 `@Conditional` 注解,根据特定条件决定是否创建 Bean。

```java
@Configuration
public class ConditionalConfig {

    @Bean
    @ConditionalOnProperty(name = "my.property", havingValue = "true")
    public MyBean myBean() {
        return new MyBean();
    }
}
```

### 4. 模块化配置

使用 `@Import` 注解导入其他配置类,实现配置的模块化和复用。

```java
@Configuration
@Import(AnotherConfig.class)
public class AppConfig {
    // ...
}
```

## 三、使用注意事项

### 1. 避免循环依赖

在配置类中尽量避免循环依赖,否则可能导致 Spring 容器启动失败。

### 2. 配置类的可见性

配置类应声明为非 `final`,且不能是局部类,以便 Spring 生成代理类。

### 3. 慎用 `@Bean` 方法调用

在 Full 模式下,不要在 `@Bean` 方法内部直接调用其他 `@Bean` 方法,应使用依赖注入获取 Bean,避免创建多余的实例。

## 四、示例

### 1. 基本配置

```java
@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public MyRepository myRepository() {
        return new MyRepositoryImpl();
    }
}
```

### 2. 条件化配置

```java
@Configuration
public class DatabaseConfig {

    @Bean
    @ConditionalOnProperty(name = "db.type", havingValue = "mysql")
    public DataSource mysqlDataSource() {
        // 创建 MySQL 数据源
        return new MysqlDataSource();
    }

    @Bean
    @ConditionalOnProperty(name = "db.type", havingValue = "postgresql")
    public DataSource postgresqlDataSource() {
        // 创建 PostgreSQL 数据源
        return new PostgresqlDataSource();
    }
}
```

---

通过合理使用 `@Configuration` 注解,可以简化 Spring 应用的配置管理,提高代码的可读性和可维护性,实现更加灵活和高效的依赖注入。

http://www.lryc.cn/news/2379134.html

相关文章:

  • Go语言语法---输入控制
  • 蓝桥杯单片机按键进阶
  • CSS- 4.3 绝对定位(position: absolute)学校官网导航栏实例
  • Flink 作业提交流程
  • 拓展运算符
  • Seata源码—6.Seata AT模式的数据源代理一
  • 计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
  • Spring Boot 与 RabbitMQ 的深度集成实践(一)
  • 黑马程序员2024新版C++笔记 第2章 语句
  • HTML5中的Microdata与历史记录管理详解
  • 上位机知识篇---涂鸦智能云平台
  • 面试中的线程题
  • 济南国网数字化培训班学习笔记-第三组-2-电力通信光缆网认知
  • 前端动画库 Anime.js 的V4 版本,兼容 Vue、React
  • 用 PyTorch 从零实现简易GPT(Transformer 模型)
  • 前端JSON序列化中的隐形杀手:精度丢失全解析与实战解决方案
  • 【通用大模型】Serper API 详解:搜索引擎数据获取的核心工具
  • Spring3+Vue3项目中的知识点——JWT
  • python3GUI--智慧交通分析平台:By:PyQt5+YOLOv8(详细介绍)
  • Linux任务管理与守护进程
  • C#里与嵌入式系统W5500网络通讯(2)
  • EMQX开源版安装指南:Linux/Windows全攻略
  • 【计算机视觉】OpenCV实战项目:GraspPicture 项目深度解析:基于图像分割的抓取点检测系统
  • MySQL 数据库备份与还原
  • Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现
  • javax.servlet.Filter 介绍-笔记
  • 从40秒到11毫秒:TiDB环境下一次SQL深潜优化实战
  • Win 11开始菜单图标变成白色怎么办?
  • 入门OpenTelemetry——应用自动埋点
  • C语言链表的操作