Spring——@Autowired和@Configuration注解区别

摘要

本文主要介绍了Spring框架中@Autowired和@Configuration注解的区别。@Autowired用于自动注入依赖,支持属性、构造器和方法注入。@Configuration则用于定义配置类,允许在类中使用@Bean注解声明Bean。文章详细解释了这两个注解的作用、使用场景和核心特性。

1. @Autowired注解

1.1.1. @Autowired作用

  • 自动注入依赖@Autowired 用于告诉 Spring 自动将某个对象注入到另一个对象的属性、构造器或方法中。
  • 它通过 类型匹配(by type)来寻找和注入 Spring 容器中的 Bean。

1.1.2. @Autowired使用场景

  1. 注入属性: 将 Spring 容器中的 Bean 自动注入到某个类的属性中。

    @Component
    public class ServiceA {
    @Autowired
    private ServiceB serviceB; // 自动注入 ServiceB 的实例
    }

  2. 构造器注入(推荐): 注入依赖时,优先使用构造器注入,能够保证对象在创建时依赖完全初始化。

    @Component
    public class ServiceA {
    private final ServiceB serviceB;

    复制代码
     @Autowired
     public ServiceA(ServiceB serviceB) {
         this.serviceB = serviceB;
     }

    }

  3. 方法注入 : 使用 @Autowired 标注的方法,Spring 会自动调用,并将依赖注入为方法参数。

    @Component
    public class ServiceA {
    private ServiceB serviceB;

    复制代码
     @Autowired
     public void setServiceB(ServiceB serviceB) {
         this.serviceB = serviceB;
     }

    }

1.1.3. @Autowired核心特性

  • 按类型注入 :默认情况下,@Autowired 根据类型查找匹配的 Bean。

  • 可选性 :可以通过 required = false 设置是否必须注入。

    @Autowired(required = false)
    private ServiceC serviceC; // 如果没有 ServiceC 的 Bean,Spring 不会抛出异常

  • 结合 @Qualifier :当存在多个类型匹配的 Bean 时,可通过 @Qualifier 指定具体的 Bean。

    @Autowired
    @Qualifier("serviceB1")
    private ServiceB serviceB; // 注入名为 serviceB1 的 Bean

1.1.4. @Autowired总结

  • @Autowired 的职责是完成依赖注入。
  • 用于类内部注入其他 Bean。
  • 是 Spring IOC(控制反转)的核心机制。

2. @Configuration

2.1. @Configuration作用

  • 配置类注解@Configuration 用于标注一个类是 Spring 的 配置类,其主要职责是定义和管理 Bean。
  • 该类中定义的方法通常使用 @Bean 注解,Spring 会将这些方法的返回值注册为容器中的 Bean。

2.2. @Configuration使用场景

  1. 定义配置类: 创建一个配置类,用于集中管理 Bean 的创建。

    @Configuration
    public class AppConfig {
    @Bean
    public ServiceA serviceA() {
    return new ServiceA();
    }

    复制代码
     @Bean
     public ServiceB serviceB() {
         return new ServiceB();
     }

    }

  2. 组合现有组件: 可以通过配置类来组合和定制第三方库或框架提供的组件。

    @Configuration
    public class CustomConfig {
    @Bean
    public RestTemplate restTemplate() {
    return new RestTemplate();
    }
    }

  3. 条件化配置 : 配置类可以与条件注解(如 @Conditional)配合,动态加载 Bean。

    @Configuration
    @ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
    public class FeatureConfig {
    @Bean
    public FeatureService featureService() {
    return new FeatureService();
    }
    }

2.3. 核心特性

  • 代替 XML 配置@Configuration 配置类是 Spring Java Config 的核心,代替了传统的 XML 文件。

  • 单例作用域@Configuration 配置类会对 @Bean 方法进行代理,确保返回的 Bean 始终是单例(即使手动调用该方法多次)。

  • 组合性 :支持通过 @Import 导入其他配置类。

    @Configuration
    @Import(OtherConfig.class)
    public class MainConfig {
    }

2.4. 总结

  • @Configuration 的职责是定义配置类,生成和管理 Bean。
  • 用于将类本身注册到 Spring 容器中,并集中管理 Bean 的创建。
  • 是 Spring Java 配置的重要组成部分。

3. 结合使用的场景

通常 @Configuration@Autowired 会一起使用,比如:

  1. @Configuration 定义 Bean:

    @Configuration
    public class AppConfig {
    @Bean
    public ServiceA serviceA() {
    return new ServiceA(serviceB());
    }

    复制代码
     @Bean
     public ServiceB serviceB() {
         return new ServiceB();
     }

    }

  2. 在其他类中用 @Autowired 注入:

    @Component
    public class Example {
    @Autowired
    private ServiceA serviceA; // 自动注入 serviceA Bean
    }

通过 @Configuration 管理 Bean 的生成,配合 @Autowired 实现依赖注入,这样可以灵活解耦和集中管理代码逻辑。

4. @Autowired和@Configuration区别总结

|---------------|----------------------------|-------------------------------|
| 特性 | @Autowired | @Configuration |
| 作用 | 用于 注入依赖,将 Bean 自动注入到类中 | 用于 定义配置类,集中管理 Bean 的创建与配置 |
| 使用范围 | 属性、构造器、方法 | 类级别 |
| 目的 | 自动装配 Spring 容器中的现有 Bean | 定义和管理 Bean,生成新的 Bean |
| 是否创建 Bean | 不会创建新 Bean,只装配已有的 Bean | 通过 @Bean 方法生成新的 Bean |
| 常用场景 | 注入属性或方法依赖 | 替代 XML 配置类,集中管理应用配置 |

博文参考

相关推荐
茶本无香1 小时前
Arthas 实战:线上“看 Map”的四种武器
java·map·arthas·线上定位
烂蜻蜓2 小时前
Flask入门教程(二十六):Session API——用户会话状态管理
后端·python·flask
霸道流氓气质2 小时前
Spring AI异常处理与重试机制
java·人工智能·spring
郑州光合科技余经理4 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖4 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利7 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
小江的记录本8 小时前
【CSS】CSS 动画:transition、animation、transform、CSS3 新特性(附《思维导图》)
前端·css·安全·spring·前端框架·css3·动画
张宇Joaquin8 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
宸津-代码粉碎机8 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749109 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构