Java Spring的依赖注入理解及@Autowired用法示例详解

 更新时间:2025年07月23日 14:29:57   作者:{⌐■_■}  
文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入Bean)与@Value(注入简单类型)的用途,并说明@Bean方法参数可自动装配依赖,无需显式注解,感兴趣的朋友跟随小编一起看看吧

一、什么是依赖注入(DI)?

1. 定义

依赖注入(Dependency Injection) 是 Spring 框架的核心功能之一,它指的是:

由 Spring 容器来管理对象之间的依赖关系,并自动将依赖对象注入到目标对象中。

2. 举个例子

比如:

public class BookService {
    private BookDao bookDao;
}

这里 BookService 依赖于 BookDao,如果手动创建:

BookDao bookDao = new BookDaoImpl();
BookService service = new BookService(bookDao);

而使用 Spring 后,你只需要告诉 Spring:

“我需要一个 BookDao,你帮我自动注入进来。”

Spring 会自动完成这个过程。

二、依赖注入的几种方式

1. 构造器注入(Constructor Injection)

public class BookService {
    private final BookDao bookDao;
    public BookService(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

2. Setter 注入(Setter Injection)

public class BookService {
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

3. 字段注入(Field Injection)—— 使用@Autowired

public class BookService {
    @Autowired
    private BookDao bookDao;
}

⚠️ 注意:字段注入虽然方便,但不利于测试和维护,推荐使用构造器注入

三、@Autowired和@Value的区别

注解用途注入类型
@Autowired注入 Spring 容器中的 Bean 对象引用类型(如 Bean)
@Value注入基本类型、字符串、SpEL 表达式简单类型(如 String、int)

示例:

✅ 引用类型注入(用@Autowired)

public class BookService {
    @Autowired
    private BookDao bookDao; // 注入一个 Bean
}

✅ 简单类型注入(用@Value)

public class AppConfig {
    @Value("com.mysql.jdbc.Driver")
    private String driver;
}

四、在@Bean方法中如何注入依赖?

你提到的这段代码:

@Bean
public DataSource dataSource(BookDao bookDao) { // 引用类型直接添加形参
    ...
}

说明:

  • 这是 基于 Java 配置类 的方式定义 Bean。
  • Spring 会自动将BookDao类型的 Bean 注入进来。
  • 不需要再写 @Autowired,因为 Spring 会自动根据类型进行装配。

五、总结

问题回答
什么是依赖注入?Spring 自动帮你把需要的对象注入进来
怎么使用?构造器、Setter、字段注入(@Autowired
@Autowired 是干嘛的?注入引用类型(Bean)
@Value 是干嘛的?注入简单类型(字符串、数字等)
为什么 @Bean 方法里可以直接加形参?Spring 会根据类型自动装配
@Autowired 这里不能用吗?@Bean 方法参数中不需要,因为 Spring 自动装配了

方法参数注入和@Autowired注入区别

  • 方法参数注入:用于在某个方法内部临时使用一个 Bean,比如定义 @Bean
  • @Autowired 字段注入:用于把 Bean 绑定到类中,整个类都可以用。

✅ 两种引用类型依赖注入方式对比

方式注解使用位置说明示例
构造器/方法参数注入无(Spring 自动装配)@Bean 方法参数 / 构造器参数Spring 会根据类型自动将依赖注入到方法参数中public DataSource dataSource(BookDao bookDao)
字段注入 / 成员变量注入@Autowired类成员变量Spring 会自动将 Bean 注入到字段上@Autowired private BookDao bookDao;

🧠 通俗理解

1.方法参数注入(如@Bean方法中)

@Bean
public DataSource dataSource(BookDao bookDao) {
    ...
}
  • Spring 会自动把已经注册的BookDao Bean 注入到这个方法参数中。
  • 这是一种 临时使用依赖 的方式,适合在配置类中定义 Bean 时使用。
  • 不需要 @Autowired,Spring 会自动完成注入。

2.字段注入(使用@Autowired)

@Component
public class BookService {
    @Autowired
    private BookDao bookDao;
}
  • 这是 把依赖绑定到类本身,类的整个生命周期都可以使用这个依赖。
  • 适用于业务组件、Service、Controller 等类中。
  • 必须使用 @Autowired 来告诉 Spring 要注入什么。

https://github.com/0voice

到此这篇关于Java Spring的依赖注入理解及@Autowired用法示例详解的文章就介绍到这了,更多相关spring依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java向MySQL添加中文数据数据库显示乱码的解决方案

    Java向MySQL添加中文数据数据库显示乱码的解决方案

    在用springboot做项目时,由于重新安装了本地Mysql数据库(5.7版本)在前台向数据库插入和更新数据可的时候,涉及中文的时候在数据库一直显示异常,所以本文给大家介绍了相关的解决方案,需要的朋友可以参考下
    2024-02-02
  • IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 创建多模块项目的超详细教程

    IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 创建多模块项目的超详细教程

    这篇文章主要介绍了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 创建多模块项目的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Android 资源 id详解及的动态获取

    Android 资源 id详解及的动态获取

    这篇文章主要介绍了Android 资源 id详解及的动态获取的相关资料,需要的朋友可以参考下
    2016-12-12
  • IDEA 下 Gradle 删除多余无用依赖的处理方法

    IDEA 下 Gradle 删除多余无用依赖的处理方法

    这篇文章主要介绍了IDEA下Gradle删除多余无用依赖,使用该插件可以一定程度上帮助我们删除无用依赖,但是也可能会多删除有用的依赖,需要在使用插件自动修复后手动检测项目,验证是否会出现问题,避免导致上线发布错误的负优化
    2022-03-03
  • Spring Cloud服务入口Gateway的介绍和使用问题小结

    Spring Cloud服务入口Gateway的介绍和使用问题小结

    Spring Cloud Gateway是Spring Cloud的⼀个全新的API⽹关项⽬, 基于Spring + SpringBoot等技术开发, ⽬的是为了替换掉Zuul,这篇文章主要介绍了Spring Cloud服务入口Gateway的介绍和使用问题小结,需要的朋友可以参考下
    2025-03-03
  • java几种排序算法的实现及简单分析

    java几种排序算法的实现及简单分析

    这篇文章主要介绍了java几种排序算法的实现及简单分析,实例分析了插入排序、希尔排序、选择排序等常用排序算法,并分析了各个算法的优劣,需要的朋友可以参考下
    2015-05-05
  • Spring Boot 整合单机websocket的步骤 附github源码

    Spring Boot 整合单机websocket的步骤 附github源码

    websocket 是一个通信协议,通过单个 TCP 连接提供全双工通信,这篇文章主要介绍了Spring Boot 整合单机websocket的步骤(附github源码),需要的朋友可以参考下
    2021-10-10
  • SpringBoot之controller参数校验详解

    SpringBoot之controller参数校验详解

    介绍了Java中使用@Validated和@Valid进行参数校验的方法,包括不同标签的使用场景、基本属性和一些常用的注解类型,同时,还讨论了如何在控制器中使用这些校验标签,以及如何处理校验结果和自定义错误消息,最后,还介绍了如何实现分组校验和嵌套校验,并提供了一些示例代码
    2024-11-11
  • 详解Java设计模式编程中的依赖倒置原则

    详解Java设计模式编程中的依赖倒置原则

    这篇文章主要介绍了详解Java设计模式中的依赖倒置原则,针对面对对象编程中的抽象的运用,需要的朋友可以参考下
    2016-02-02
  • Spring boot 总结之跨域处理cors的方法

    Spring boot 总结之跨域处理cors的方法

    本篇文章主要介绍了Spring boot 总结之跨域处理cors的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02

最新评论