spring-依赖注入

1. Spring依赖注入的概述

Spring的依赖注入(DI)是Spring容器的一部分,通过这种方式,Spring管理对象的创建和依赖关系,从而减少了类之间的耦合。Spring支持三种主要的依赖注入方式:

  • 构造器注入:通过构造方法传递依赖对象。

  • Setter注入:通过setter方法传递依赖对象。

  • 字段注入:通过字段(通常使用注解)直接注入依赖对象。

Spring提供了非常强大的自动装配功能,可以通过注解自动注入Bean,简化了开发。

2. 代码结构和注解详解

Spring配置类(SpringConfig):

  • @Configuration:标记为Spring配置类,相当于传统的XML配置文件。

  • @ComponentScan("com.itheima"):告诉Spring扫描com.itheima包下的所有类,并注册为Spring容器中的Bean。任何带有@Component、@Service、@Repository等注解的类都会被自动扫描并注册。

  • @PropertySource({"jdbc.properties"}):加载外部的jdbc.properties配置文件,这个文件中的属性可以被注入到Spring容器中的Bean。

DAO实现类(BookDaoImpl) - 字段注入(@Value):

  • @Value("${name}"):这个注解用于注入简单类型(例如String、int等)。它从外部配置文件(jdbc.properties)中读取name的值,并注入到name字段。name的值为itheima888(从jdbc.properties中读取)。

  • @Repository("bookDao"):将BookDaoImpl注册为Spring容器中的一个Bean,并指定它的名称为bookDao。

这是BookDao接口的第二个实现类,它也是通过@Repository("bookDao2")注册为一个Bean。

服务层(BookServiceImpl) - 引用类型注入(@Autowired 和 @Qualifier):

  • @Autowired:Spring会自动注入BookDao类型的Bean到bookDao字段。Spring会查找容器中类型为BookDao的Bean进行注入。

  • @Qualifier("bookDao"):当有多个BookDao的实现时,@Qualifier用于指定注入的具体Bean(此处为bookDao)。如果没有使用@Qualifier,Spring会根据类型自动选择Bean,但如果有多个同类型的Bean,Spring就无法确定该注入哪个Bean。

3. 总结 - 依赖注入的关键点

  • @Autowired:用于注入引用类型的依赖,Spring会自动查找并注入容器中的相应Bean。默认情况下是按类型注入。

  • @Qualifier :当容器中有多个同类型的Bean时,@Qualifier可以指定要注入的具体Bean的名称。

  • @Value :用于注入简单类型(如String、int等)。可以从外部配置文件中读取属性值。

  • @ComponentScan :自动扫描指定包下的所有类,并将带有@Component、@Service、@Repository等注解的类注册为Bean。

  • @PropertySource:加载外部的properties文件,并将其中的属性注入到Spring容器中的Bean。

4.管理第三方bean

(1)管理第三方Bean概述

在Spring中,除了管理自定义的Bean,Spring还允许你通过配置类来管理第三方库的Bean。比如,你可以使用@Bean注解将第三方的数据源(例如DruidDataSource)配置为Spring容器中的Bean。这种方式使得你可以利用Spring的容器管理第三方对象,并对其进行自动装配。

(2)代码

JdbcConfig 配置类 - 定义第三方数据源 (DruidDataSource):

  • @Value:用于注入外部配置(如数据库的连接信息)。这些配置通过@Value注解注入到driver、url、userName、password字段中(简单类型依赖注入)。

  • @Bean:这是Spring的核心注解之一,用来标记一个方法,表示该方法返回的对象将被注册为Spring容器中的一个Bean。在这里,dataSource()方法返回的是一个DataSource对象,它是第三方库DruidDataSource的实例。

  • BookDao作为dataSource方法的参数,表示dataSource方法会自动注入Spring容器中类型为BookDao的Bean(引用类型依赖注入)。

SpringConfig 配置类 - 导入JdbcConfig:

  • @Import({JdbcConfig.class}):通过@Import注解将JdbcConfig类导入到SpringConfig中,表示Spring配置类SpringConfig不仅会扫描com.itheima包下的Bean,还会加载JdbcConfig类中定义的Bean(如DruidDataSource)。

  • @ComponentScan("com.itheima"):告诉Spring容器扫描com.itheima包下的所有类并将其注册为Bean。

(3)管理第三方Bean的关键点

  • @Bean 注解 :用于将方法的返回值注册为Spring容器中的Bean。这种方式常用于管理第三方库的Bean,例如DruidDataSource。

  • @Value 注解 :用于注入来自外部配置(如application.properties、jdbc.properties等)中的值。这样你可以通过配置文件灵活地管理Bean的属性。

  • @Import 注解 :允许将另一个配置类导入当前配置类。使用@Import可以将多个配置类组合在一起,简化管理多个配置类的情况。

  • 数据源管理 :通过@Bean注解,Spring可以管理像DruidDataSource这样的数据源,而不需要手动创建和管理其生命周期。Spring会自动创建Bean并将其注入需要的地方。

5.xml与注解配置对比

相关推荐
小码哥_常3 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw7 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号8 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨8 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠8 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel9 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放9 小时前
Python基础语法练习题(73)
java·前端·python