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

【Java】Spring的依赖注入理解,@Autowired用法

一、什么是依赖注入(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 {@Autowiredprivate BookDao bookDao;
}

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


三、@Autowired@Value 的区别

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

示例:

✅ 引用类型注入(用 @Autowired
public class BookService {@Autowiredprivate 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 {@Autowiredprivate BookDao bookDao;
}
  • 这是 把依赖绑定到类本身,类的整个生命周期都可以使用这个依赖。
  • 适用于业务组件、Service、Controller 等类中。
  • 必须使用 @Autowired 来告诉 Spring 要注入什么。

https://github.com/0voice

http://www.dtcms.com/a/291005.html

相关文章:

  • 网络数据分层封装与解封过程的详细说明
  • STM32 开发的鼠标:技术详解与实现指南
  • RBAC(Role-Based Access Control,基于角色的访问控制)介绍(一种通过角色来管理用户权限的访问控制模型)
  • 深入解析 SymPy 中的符号计算:导数与变量替换的实践指南
  • 【未限制消息消费导致数据库CPU告警问题排查及解决方案】
  • 司南评测体系全新升级,“五位一体”评估全链路关键能力
  • 神经网络过拟合处理:原理与实践
  • C++实战案例:从static成员到线程安全的单例模式
  • Spring AI 系列之十八 - ChatModel
  • 【实战】Dify从0到100进阶--文档解读(10)参数提取HTTP节点
  • MybatisPlus-15.扩展功能-逻辑删除
  • 国产电钢琴核心优缺点是什么?
  • 深度学习 ---神经网络以及数据准备
  • C++基础数据结构
  • Ubuntu 22 安装 ZooKeeper 3.9.3 记录
  • Cookie、Session、Local Storage和Session Storage区别
  • 低代码平台有什么特殊优势
  • 小架构step系列21:参数和返回值的匹配
  • 昇腾310P软件安装说明
  • java和ptyhon对比
  • 网络编程 示例
  • A316-HF-DAC-V1:专业USB HiFi音频解码器评估板技术解析
  • Linux 文件操作详解:结构、系统调用、权限与实践
  • C语言-字符串数组
  • DL00691-基于深度学习的轴承表面缺陷目标检测含源码python
  • 【STM32】485接口原理
  • Jmeter如何做接口测试?
  • soft_err错误
  • 【C语言进阶】结构体练习:通讯录
  • OCR 赋能发票管理系统:守护医疗票据合规,让管理更智能